Python 根据值向DataFrame添加行
我有以下数据帧:Python 根据值向DataFrame添加行,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有以下数据帧: start_timestamp_milli end_timestamp_milli name rating 1 1555414708025 1555414723279 Valence 2 2 1555414708025 1555414723279 Arousal 6 3 1555414708025
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 1555414708025 1555414723279 Surprise 0
8 1555414708025 1555414723279 Stress 0
9 1555414813304 1555414831795 Valence 3
10 1555414813304 1555414831795 Arousal 5
11 1555414813304 1555414831795 Dominance 2
12 1555414813304 1555414831795 Sadness 0
13 1555414813304 1555414831795 Happiness 0
14 1555414813304 1555414831795 Anger 0
15 1555414708025 1555414723279 Surprise 0
16 1555414708025 1555414723279 Stress 0
17 1555414921819 1555414931382 Valence 1
18 1555414921819 1555414931382 Arousal 7
19 1555414921819 1555414931382 Dominance 2
20 1555414921819 1555414931382 Sadness 1
21 1555414921819 1555414931382 Happiness 0
22 1555414921819 1555414931382 Anger 1
23 1555414708025 1555414723279 Surprise 0
24 1555414708025 1555414723279 Stress 1
现在,对于具有相同start\u timestamp\u milli
和end\u timestamp\u milli
的每个块,如果悲伤、快乐、愤怒、惊讶和压力的评级为0,否则为0,我想再插入一行,名称为“中立”,评级为1。新行的start\u timestamp\u milli
和end\u timestamp\u milli
应设置为该块的值
生成的数据帧应如下所示:
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 1555414708025 1555414723279 Surprise 0
8 1555414708025 1555414723279 Stress 0
9 1555414708025 1555414723279 Neutral 0
10 1555414813304 1555414831795 Valence 3
11 1555414813304 1555414831795 Arousal 5
12 1555414813304 1555414831795 Dominance 2
13 1555414813304 1555414831795 Sadness 0
14 1555414813304 1555414831795 Happiness 0
15 1555414813304 1555414831795 Anger 0
16 1555414708025 1555414723279 Surprise 0
17 1555414708025 1555414723279 Stress 0
18 1555414708025 1555414723279 Neutral 1
19 1555414921819 1555414931382 Valence 1
20 1555414921819 1555414931382 Arousal 7
21 1555414921819 1555414931382 Dominance 2
22 1555414921819 1555414931382 Sadness 1
23 1555414921819 1555414931382 Happiness 0
24 1555414921819 1555414931382 Anger 1
25 1555414708025 1555414723279 Surprise 0
26 1555414708025 1555414723279 Stress 1
27 1555414708025 1555414723279 Neutral 0
如何做到这一点呢?我会先
pivot
,这使得查找更容易,然后调整初始数据帧
f = (df.pivot_table(index=['start_timestamp_milli', 'end_timestamp_milli'],
columns='name', values='rating', aggfunc='any', fill_value=0).astype(int))
现在查找时间戳组合:
cols = ['Sadness', 'Happiness', 'Anger', 'Surprise', 'Stress']
appd = pd.Series(np.where(f[cols].any(1), 0, 1), index=f.index)
res = pd.concat([df, appd.rename('rating').reset_index().assign(name='Neutral')])
这会将它们添加到帧的末尾,如果希望它们间歇放置,则需要进行排序。您可以尝试:
# turn to long table with columns being feelings
new_df = (df.pivot_table(index=['start_timestamp_milli', 'end_timestamp_milli',],
columns='name',
values='rating')
.fillna(0)
)
new_df['Neutral'] = (new_df[['Sadness','Happiness','Anger', 'Surprise', 'Stress']]
.eq(0).all(axis=1).astype(int)
)
new_series = new_df[['Neutral']].stack()
new_series.name = 'rating'
df = pd.concat((df, new_series.reset_index()))
您可以在
groupby
agg+all
之前使用过滤器,然后concat
返回结果
s=df.loc[df.name.isin(['Sadness', 'Happiness', 'Anger', 'Surprise' , 'Stress']),'rating'].\
eq(0).\
groupby([df['start_timestamp_milli'],df['end_timestamp_milli']]).\
agg('all').reset_index().assign(name='Neutral')
df=pd.concat([df,s],sort=False).sort_values(['start_timestamp_milli','end_timestamp_milli'])
df
Out[66]:
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 1555414708025 1555414723279 Surprise 0
8 1555414708025 1555414723279 Stress 0
15 1555414708025 1555414723279 Surprise 0
16 1555414708025 1555414723279 Stress 0
23 1555414708025 1555414723279 Surprise 0
24 1555414708025 1555414723279 Stress 1
0 1555414708025 1555414723279 Neutral 0
9 1555414813304 1555414831795 Valence 3
10 1555414813304 1555414831795 Arousal 5
11 1555414813304 1555414831795 Dominance 2
12 1555414813304 1555414831795 Sadness 0
13 1555414813304 1555414831795 Happiness 0
14 1555414813304 1555414831795 Anger 0
1 1555414813304 1555414831795 Neutral 1
17 1555414921819 1555414931382 Valence 1
18 1555414921819 1555414931382 Arousal 7
19 1555414921819 1555414931382 Dominance 2
20 1555414921819 1555414931382 Sadness 1
21 1555414921819 1555414931382 Happiness 0
22 1555414921819 1555414931382 Anger 1
2 1555414921819 1555414931382 Neutral 0
IIUC:
创造这个小家伙
neutral = df.set_index(se).query('name in @names').rating.eq(0).all(level=[0, 1]).mul(1)
neutral
start_timestamp_milli end_timestamp_milli
1555414708025 1555414723279 0
1555414813304 1555414831795 1
1555414921819 1555414931382 0
Name: rating, dtype: int64
然后将名称
列添加到其上,其值为'Neutral'
,并将其附加到原始名称中。别忘了整理东西,让它重新变得漂亮。
df.append(neutral.reset_index().assign(name='Neutral'), sort=False) \
.sort_values(se).reset_index(drop=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 Happiness 0
5 1555414708025 1555414723279 Anger 0
6 1555414708025 1555414723279 Surprise 0
7 1555414708025 1555414723279 Stress 0
8 1555414708025 1555414723279 Surprise 0
9 1555414708025 1555414723279 Stress 0
10 1555414708025 1555414723279 Surprise 0
11 1555414708025 1555414723279 Stress 1
12 1555414708025 1555414723279 Neutral 0
13 1555414813304 1555414831795 Valence 3
14 1555414813304 1555414831795 Arousal 5
15 1555414813304 1555414831795 Dominance 2
16 1555414813304 1555414831795 Sadness 0
17 1555414813304 1555414831795 Happiness 0
18 1555414813304 1555414831795 Anger 0
19 1555414813304 1555414831795 Neutral 1
20 1555414921819 1555414931382 Valence 1
21 1555414921819 1555414931382 Arousal 7
22 1555414921819 1555414931382 Dominance 2
23 1555414921819 1555414931382 Sadness 1
24 1555414921819 1555414931382 Happiness 0
25 1555414921819 1555414931382 Anger 1
26 1555414921819 1555414931382 Neutral 0
生成的数据帧等于起始帧dataframe@Valentino不,不是。生成的数据帧还有3行。啊,我现在看到了。对不起,我喜欢你的想法。
neutral = df.set_index(se).query('name in @names').rating.eq(0).all(level=[0, 1]).mul(1)
neutral
start_timestamp_milli end_timestamp_milli
1555414708025 1555414723279 0
1555414813304 1555414831795 1
1555414921819 1555414931382 0
Name: rating, dtype: int64
df.append(neutral.reset_index().assign(name='Neutral'), sort=False) \
.sort_values(se).reset_index(drop=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 Happiness 0
5 1555414708025 1555414723279 Anger 0
6 1555414708025 1555414723279 Surprise 0
7 1555414708025 1555414723279 Stress 0
8 1555414708025 1555414723279 Surprise 0
9 1555414708025 1555414723279 Stress 0
10 1555414708025 1555414723279 Surprise 0
11 1555414708025 1555414723279 Stress 1
12 1555414708025 1555414723279 Neutral 0
13 1555414813304 1555414831795 Valence 3
14 1555414813304 1555414831795 Arousal 5
15 1555414813304 1555414831795 Dominance 2
16 1555414813304 1555414831795 Sadness 0
17 1555414813304 1555414831795 Happiness 0
18 1555414813304 1555414831795 Anger 0
19 1555414813304 1555414831795 Neutral 1
20 1555414921819 1555414931382 Valence 1
21 1555414921819 1555414931382 Arousal 7
22 1555414921819 1555414931382 Dominance 2
23 1555414921819 1555414931382 Sadness 1
24 1555414921819 1555414931382 Happiness 0
25 1555414921819 1555414931382 Anger 1
26 1555414921819 1555414931382 Neutral 0