[英]Adding rows to groups in Pandas DataFrame
我有以下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。
對於每個這樣的組,如果在名稱列中不顯示“ Anger”和“ Happiness”,我想將其插入,並將其評定為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
如何才能做到這一點?
我正在使用unstack
+ stack
+ reindex
s=set(df.name.unique().tolist()+['Anger','Happiness'])
df.set_index(df.columns[:-1].tolist()).rating.\
unstack(fill_value=0).\
reindex(columns=s,fill_value=0).\
stack().reset_index()
這非常明確地循環遍歷每個組,並追加虛擬數據幀並刪除重復項。
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
這將建立一個新索引並使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.