python - 生成pandas中的所有组合

标签 python pandas

我有一个数据框,如:

df = pd.DataFrame([['A', 3, 'fox'], ['A', 3, 'cat'], ['A', 3, 'dog'],
                   ['B', 2, 'rabbit'], ['B', 2, 'dog'], ['B', 2, 'eel'],
                   ['C', 6, 'fox'], ['C', 6, 'elephant']],
                  columns=['group', 'val', 'animal'])
df
输出:
    group   val animal
0   A       3   fox
1   A       3   cat
2   A       3   dog
3   B       2   rabbit
4   B       2   dog
5   B       2   eel
6   C       6   fox
7   C       6   elephant
对于给定的组,val总是相同的(所以对于 A 总是 3,对于 B 总是 2,对于 C 总是 6)。
如何使用 group 的所有组合生成数据帧和 animal元素?还有 val应该结转,并且应该有一列指示该行是否存在于原始数据中或添加到排列中。
想要的结果:
df = pd.DataFrame([['A', 3, 'fox', 1], ['A', 3, 'cat', 1], ['A', 3, 'dog', 1], ['A', 3, 'rabbit', 0], ['A', 3, 'eel', 0], ['A', 3, 'elephant', 0],
                   ['B', 2, 'rabbit', 1], ['B', 2, 'dog', 1], ['B', 2, 'eel', 1], ['B', 2, 'fox', 0], ['B', 2, 'cat', 0], ['B', 2, 'elephant', 0],
                   ['C', 6, 'fox', 1], ['C', 6, 'elephant', 1], ['C', 6, 'cat', 0], ['C', 6, 'dog', 0], ['C', 6, 'rabbit', 0], ['C', 6, 'eel', 0]], 
                  columns=['group', 'val', 'animal', 'occurred'])
df
输出:
    group   val animal  occurred
0   A       3   fox         1
1   A       3   cat         1
2   A       3   dog         1
3   A       3   rabbit      0
4   A       3   eel         0
5   A       3   elephant    0
6   B       2   rabbit      1
7   B       2   dog         1
8   B       2   eel         1
9   B       2   fox         0
10  B       2   cat         0
11  B       2   elephant    0
12  C       6   fox         1
13  C       6   elephant    1
14  C       6   cat         0
15  C       6   dog         0
16  C       6   rabbit      0
17  C       6   eel         0
我怎样才能做到这一点?
编辑:有一些有效的答案。我会给任何可以处理多列连接到 group 的可能性的“最佳”。 (例如,不仅仅是 'val' 而是 ['val1','val2'] )以优雅的方式。

最佳答案

一种解决方案是使用 reindex MultiIndex :

mux = pd.MultiIndex.from_product([df['group'].unique(), df['animal'].unique()], names=('group','animal'))
df = df.set_index(['group','animal']).reindex(mux).reset_index()
df['occurred'] = df['val'].notnull().astype(int)
df['val'] = df.groupby('group')['val'].transform('first')
结果:
   group    animal  val  occurred
0      A       fox  3.0         1
1      A       cat  3.0         1
2      A       dog  3.0         1
3      A    rabbit  3.0         0
4      A       eel  3.0         0
5      A  elephant  3.0         0
6      B       fox  2.0         0
7      B       cat  2.0         0
8      B       dog  2.0         1
9      B    rabbit  2.0         1
10     B       eel  2.0         1
11     B  elephant  2.0         0
12     C       fox  6.0         1
13     C       cat  6.0         0
14     C       dog  6.0         0
15     C    rabbit  6.0         0
16     C       eel  6.0         0
17     C  elephant  6.0         1

分机号:
要处理多个 val 列,请使用列名列表而不是仅 'val' .只有最后两行略有变化。
val_cols = ['val1', 'val2']

mux = pd.MultiIndex.from_product([df['group'].unique(), df['animal'].unique()], names=('group','animal'))
df = df.set_index(['group','animal']).reindex(mux).reset_index()
df['occurred'] = df[val_cols[0]].notnull().astype(int)
df[val_cols ] = df.groupby('group')[val_cols].transform('first')

关于python - 生成pandas中的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63460465/

相关文章:

python - 按时间间隔分组和计数 - Python

iphone - 在 iPhone OS 应用程序中使用 Ruby/Python 代码?

python - IndexError和字典

python - Pandas - 解析带和不带毫秒的时间数据

python - 如何正确分配给 pandas 中的多索引数据帧的切片?

python Pandas : Generate Document-Term matrix from whitespace delimited '.dat' file

python - 用于存储排序字段以有效允许修改的数据结构

python - 查找由不规则数据点定义的体积 - python

python - 如何使用 Python Amazon Simple Product API 获取产品价格

python - 获取另一列中每个唯一值的前 2 个值