我有以下 Pandas DataFrame:
start_timestamp_milli end_timestamp_milli name rating
1 1555414708025 1555414723279 Valence 2
2 1555414708025 1555414723279 Arousal 6
3 1555414708025 1555414723279 Dominance 2
4 1555414708025 1555414723279 Sadness 1
5 1555414813304 1555414831795 Valence 3
6 1555414813304 1555414831795 Arousal 5
7 1555414813304 1555414831795 Dominance 2
8 1555414813304 1555414831795 Sadness 1
9 1555414921819 1555414931382 Valence 1
10 1555414921819 1555414931382 Arousal 7
11 1555414921819 1555414931382 Dominance 2
12 1555414921819 1555414931382 Sadness 1
13 1555414921819 1555414931382 Anger 1
在上面的示例中,有三个组可以按 start_timestamp_milli 和 end_timestamp_milli 进行分组。第一组从索引 1 到 4,第二组从索引 5 - 8,第三组从索引 9 到 13。
对于每个这样的组,如果名称列中不存在“愤怒”和“快乐”,我想将其插入评级为 0。如果存在,则不会发生任何事情。
最终结果应该是这样的。添加的行是第 5、6、11、12 和 18 行。
start_timestamp_milli end_timestamp_milli name rating
1 1555414708025 1555414723279 Valence 2
2 1555414708025 1555414723279 Arousal 6
3 1555414708025 1555414723279 Dominance 2
4 1555414708025 1555414723279 Sadness 1
5 1555414708025 1555414723279 Happiness 0
6 1555414708025 1555414723279 Anger 0
7 1555414813304 1555414831795 Valence 3
8 1555414813304 1555414831795 Arousal 5
9 1555414813304 1555414831795 Dominance 2
10 1555414813304 1555414831795 Sadness 1
11 1555414813304 1555414831795 Happiness 0
12 1555414813304 1555414831795 Anger 0
13 1555414921819 1555414931382 Valence 1
14 1555414921819 1555414931382 Arousal 7
15 1555414921819 1555414931382 Dominance 2
16 1555414921819 1555414931382 Sadness 1
17 1555414921819 1555414931382 Happiness 0
18 1555414921819 1555414931382 Anger 1
如何做到这一点?
最佳答案
选项 1
这非常明确地遍历每个组并附加虚拟数据框并删除重复项。
d = dict(name=['Anger', 'Happiness'], rating=0)
cols = ['start_timestamp_milli', 'end_timestamp_milli']
def f(d0, k):
d1 = pd.DataFrame({**dict(zip(cols, k)), **d})
return d0.append(d1, ignore_index=True).drop_duplicates('name')
pd.concat([f(d, k) for k, d in df.groupby(cols)], ignore_index=True)
start_timestamp_milli end_timestamp_milli name rating
0 1555414708025 1555414723279 Valence 2
1 1555414708025 1555414723279 Arousal 6
2 1555414708025 1555414723279 Dominance 2
3 1555414708025 1555414723279 Sadness 1
4 1555414708025 1555414723279 Anger 0
5 1555414708025 1555414723279 Happiness 0
6 1555414813304 1555414831795 Valence 3
7 1555414813304 1555414831795 Arousal 5
8 1555414813304 1555414831795 Dominance 2
9 1555414813304 1555414831795 Sadness 1
10 1555414813304 1555414831795 Anger 0
11 1555414813304 1555414831795 Happiness 0
12 1555414921819 1555414931382 Valence 1
13 1555414921819 1555414931382 Arousal 7
14 1555414921819 1555414931382 Dominance 2
15 1555414921819 1555414931382 Sadness 1
16 1555414921819 1555414931382 Anger 1
17 1555414921819 1555414931382 Happiness 0
选项 2
这将构建一个新索引并使用 reindex
cats = ['Anger', 'Happiness']
cols = ['start_timestamp_milli', 'end_timestamp_milli']
d = df.set_index([*cols, 'name'])
i = pd.MultiIndex.from_tuples(
[(s, e, n) for s, e in {*zip(*map(df.get, cols))} for n in cats],
names=d.index.names
) | d.index
df.set_index([*cols, 'name']).reindex(i, fill_value=0).reset_index()
start_timestamp_milli end_timestamp_milli name rating
0 1555414708025 1555414723279 Anger 0
1 1555414708025 1555414723279 Arousal 6
2 1555414708025 1555414723279 Dominance 2
3 1555414708025 1555414723279 Happiness 0
4 1555414708025 1555414723279 Sadness 1
5 1555414708025 1555414723279 Valence 2
6 1555414813304 1555414831795 Anger 0
7 1555414813304 1555414831795 Arousal 5
8 1555414813304 1555414831795 Dominance 2
9 1555414813304 1555414831795 Happiness 0
10 1555414813304 1555414831795 Sadness 1
11 1555414813304 1555414831795 Valence 3
12 1555414921819 1555414931382 Anger 1
13 1555414921819 1555414931382 Arousal 7
14 1555414921819 1555414931382 Dominance 2
15 1555414921819 1555414931382 Happiness 0
16 1555414921819 1555414931382 Sadness 1
17 1555414921819 1555414931382 Valence 1
关于python - 将行添加到 Pandas DataFrame 中的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56062236/