如何在Pandas中使用另一个数据框(与字符串列相关)添加新列

时间:2019-05-06 07:31:55

标签: python pandas dataframe

令人困惑的标题,让我解释一下。我有2个这样的数据框:

名为df1的数据帧:看起来像这样(原始有百万行):

id `  text                             c1      
1     Hello world how are you people    1 
2     Hello people I am fine  people    1
3     Good Morning people               -1
4     Good Evening                      -1

名为df2的数据框如下所示:

Word      count         Points         Percentage

hello        2             2              100
world        1             1              100
how          1             1              100
are          1             1              100
you          1             1              100
people       3             1              33.33
I            1             1              100
am           1             1              100
fine         1             1              100
Good         2             -2            -100
Morning      1             -1            -100
Evening      1             -1            -100
                -1

df2列说明:

count表示单词在df1

中出现的总次数

points是通过某种算法赋予每个单词的分数

percentage =积分/计数* 100

现在,我想根据要点和百分比在df1中添加40个新列。它们将如下所示:

perc_-90_2 perc_-80_2 perc_-70_2 perc_-60_2 perc_-50_2 perc_-40_2 perc_-20_2 perc_-10_2 perc_0_2 {{ 1}} perc_10_2 perc_20_2 perc_30_2 perc_40_2 perc_50_2 perc_60_2 perc_70_2 perc_80_2

perc_90_2 perc_-90_1 perc_-80_1 perc_-70_1 perc_-60_1 perc_-50_1 perc_-40_1 perc_-20_1 perc_-10_1 {{ 1}} perc_0_1 perc_10_1 perc_20_1 perc_30_1 perc_40_1 perc_50_1 perc_60_ perc_70_1

让我分解一下。列名包含3个部分:

1。)perc_80_1只是一个字符串,什么都没有

2。)范围从-90到+90的数字。例如,此处-90表示perc_90_1中的百分比为-90。现在,例如,如果某个单词的百分比值在81-90范围内,则该行和名为perc的列中的值将为df21是第三部分。

3。)第三部分是计数。在这里,我想要两种类型的计数。 prec_-80_xxxx。如第2点中给出的示例,如果单词计数在0到1的范围内,则该值将在1列中为2。如果字数为2或更多,则1列中的值为prec_-80_1

我希望它不会造成混乱。

1 个答案:

答案 0 :(得分:2)

使用:

#change previous answer with add id for matching
df2 = (df.drop_duplicates(['id','Word'])
         .groupby('Word', sort=False)
         .agg({'c1':['sum','size'], 'id':'first'})
         )
df2.columns = df2.columns.map(''.join)
df2 = df2.reset_index()
df2 = df2.rename(columns={'c1sum':'Points','c1size':'Totalcount','idfirst':'id'})

df2['Percentage'] = df2['Points'] / df2['Totalcount'] * 100


s1 = df2['Percentage'].div(10).astype(int).mul(10).astype(str)
s2 = np.where(df2['Totalcount'] == 1, '1', '2')
#s2= np.where(df1['Totalcount'].isin([0,1]), '1', '2')
#create colum by join
df2['new'] = 'perc_' + s1 + '_' +s2

#create indicator DataFrame
df3 = pd.get_dummies(df2[['id','new']].drop_duplicates().set_index('id'), 
                     prefix='', 
                     prefix_sep='').max(level=0)
print (df3)

#reindex for add missing columns
c = 'perc_' + pd.Series(np.arange(-100, 110, 10).astype(str)) + '_'
cols = (c + '1').append(c + '2')
#join to original df1
df = df1.join(df3.reindex(columns=cols, fill_value=0), on='id')

print (df)
   id                            text  c1  perc_-100_1  perc_-90_1  \
0   1  Hello world how are you people   1            0           0   
1   2   Hello people I am fine people   1            0           0   
2   3             Good Morning people  -1            1           0   
3   4                    Good Evening  -1            1           0   

   perc_-80_1  perc_-70_1  perc_-60_1  perc_-50_1  perc_-40_1  ...  perc_10_2  \
0           0           0           0           0           0  ...          0   
1           0           0           0           0           0  ...          0   
2           0           0           0           0           0  ...          0   
3           0           0           0           0           0  ...          0   

   perc_20_2  perc_30_2  perc_40_2  perc_50_2  perc_60_2  perc_70_2  \
0          0          1          0          0          0          0   
1          0          0          0          0          0          0   
2          0          0          0          0          0          0   
3          0          0          0          0          0          0   

   perc_80_2  perc_90_2  perc_100_2  
0          0          0           1  
1          0          0           0  
2          0          0           0  
3          0          0           0  

[4 rows x 45 columns]