我有一个数据框,如:
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/