令人困惑的标题,让我解释一下。我有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
的列中的值将为df2
。 1
是第三部分。
3。)第三部分是计数。在这里,我想要两种类型的计数。 prec_-80_xx
和xx
。如第2点中给出的示例,如果单词计数在0到1的范围内,则该值将在1
列中为2
。如果字数为2或更多,则1
列中的值为prec_-80_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]