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