Python和Pandas新手,感谢任何帮助。
我有两个csv,control.csv
和replies.csv
,它们都包含user_id
和text
列(见下文)。
control.csv
user_id, text
4102, text0
5109, text1
5349, text2
replies.csv
user_id, text
4102, texta
4102, textb
5109, textc
我想计算control.csv
中user_id
中的值出现在replies.csv
中的次数。然后,我想在control.csv
中名为replies
的新列中写入该计数。期望的输出如下所示:
user_id, text, replies
4102, text0, 2
5109, text1, 1
5349, text2, 0
可以通过下面的代码从replies.csv
生成user_id
的出现次数。然而,我不确定下一步该怎么做才能将control.csv
中的user_id
与replies.csv
中的值计数相匹配。
import pandas as pd
df_replies = pd.read_csv('replies.csv')
df_control = pd.read_csv('control.csv')
reply_count = df_replies['user_id'].value_counts()
有什么建议吗?谢谢你的帮助。
尝试通过groupby()
+count()
获得应答数,然后使用map()
映射值,并使用fillna()
填充NaN值为0:
control['replies']=(control['user_id'].map(replies.groupby('user_id')['text'].count())
.fillna(0,downcast='infer'))
或
与上面相同的方法,但使用merge()
:
count=replies.groupby('user_id')['text'].count().reset_index(name='replies')
control=control.merge(count,on='user_id',how='left').fillna(0,downcast='infer')
control
输出:
user_id text replies
0 4102 text0 2
1 5109 text1 1
2 5349 text2 0
使用链接
…
(control
.merge(replies, how="left", on="user_id")
.groupby(by="user_id")
.agg(replies_=("text_y", "count"))
)
我们留下了连接控制数据和回复。这将导致NaN,其中数据存在于控制中,但不存在于应答中。这就是为什么要从回复中计算数据。
import pandas as pd
# create data
df_control = pd.DataFrame([[4102,'text0'],[5109,'text1',[5349,'text2']],columns=['user_id','text'])
df_replies = pd.DataFrame([[4102,'texta'],[4102,'textb'], [5109,'textc']],columns=['user_id','text'])
# count value:isin the key process
df_replies_in_control = df_replies[df_replies['user_id'].isin(set(df_control['user_id']))]
df_replies_in_control_counts = df_replies_in_control['user_id'].value_counts()
# import num into control data df:give zero where not show in control
df_control_add_num = df_control.copy()
df_control_add_num['replies'] = [df_replies_in_control_counts[num] if num in
df_replies_in_control_counts.index else 0 for num in df_control['user_id']]
df_control_add_num就是结果。我希望这将解决你的问题。