[英]Pandas - grouping messages as conversations by linking multiple rows based on ids from two columns
我有一些數據可根據source_id和response_id跟蹤推文和響應。 source_id可以與原始帖子或具有自己響應的響應關聯。 如果存在多個響應,則每個響應將具有一個source_id,並且該source_id將出現在相應響應的response_id中。
以這個數據框為例:
df = pd.DataFrame({
'date': ['2018-10-02', '2018-10-03', '2018-10-03', '2018-10-03', '2018-10-03', '2018-10-03', '2018-10-03', '2018-10-03', '2018-10-03'],
'id': ['334', '335', '336', '337', '338', '340', '341', '343', '358'],
'source_id': ['830', '636', '657', '569', '152', '975', '984', '720', '524'],
'reply_id': [np.nan, '495', '636', '657', '569', '830', '152', np.nan, np.nan]
})
及其輸出:
date id source_id reply_id
0 2018-10-02 334 830 NaN
1 2018-10-03 335 636 495
2 2018-10-03 336 657 636
3 2018-10-03 337 569 657
4 2018-10-03 338 152 569
5 2018-10-03 340 975 830
6 2018-10-03 341 984 152
7 2018-10-03 343 720 NaN
8 2018-10-03 358 524 NaN
每行包含一條消息的數據。 無論是推文還是對推文的響應,消息都有唯一的ID。 在此示例中,有兩個“對話”,一個或多個對原始帖子的回復,以及兩個獨立的推文,沒有回復。 沒有響應的推文是df.iloc[7]
和df.iloc[8]
,這兩個推文在reply_id中都具有NaN,並且它們的source_id不出現在任何其他行的reply_id中。 盡管df.iloc[0]
包含NaN,但其source_id出現在df.iloc[5]
的reply_id中。 因此,這將被視為一次對話。
我真正要解決的問題是如何將一系列tweet /響應(例如df.iloc[1]
, df.iloc[2]
, df.iloc[3]
, df.iloc[4]
和df.iloc[6]
df.iloc[4]
df.iloc[6]
並將其全部計為一次對話。 對於此特定對話,原始帖子沒有可用數據,因此沒有source_id = 495的行。
有人對如何解決這個問題有任何想法嗎?
據我了解,這更像是網絡問題,因此我們使用networkx
import networkx as nx
G=nx.from_pandas_edgelist(df.dropna(), 'reply_id', 'source_id')
l=list(nx.connected_components(G))
newdf=pd.DataFrame(l)
newdf
Out[334]:
0 1 2 3 4 5
0 975 830 None None None None
1 984 495 636 152 569 657
# here you saw all the value belong to one group, they are in the same line
詳細信息,現在同一組索引將具有相同的ID
d=[dict.fromkeys(y,x)for x , y in enumerate(list(nx.connected_components(G)))]
d={k:v for element in d for k,v in element.items()}
ids=df.reply_id.dropna().map(d)
ids
Out[344]:
1 1
2 1
3 1
4 1
5 0
6 1
Name: reply_id, dtype: int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.