我有以下示例DataFrame:
| id | lang | text |
_______________________________
| "1" | "en" | "text1" |
| "2" | "ua" | "text2" |
| "1" | "en" | "text3" |
| "2" | "en" | "text4" |
| "3" | "en" | "text5" |
| "4" | "ru" | "text6" |
| "4" | "en" | "text7" |
| "3" | "ua" | "text8" |
我需要按ID和语言对其进行分组,并将文本作为单独的列表输出。
上面DataFrame的输出应该如下:
应该有一个唯一ID列表:
[1, 2, 3, 4]
对于 lang 列中的每种语言,都应该有一个单独的列表,其中包含 text 列中的文本,其中包含唯一ID列表的长度,在本例中为if每个ID都有多个文本,然后将它们连接起来(例如,通过空格)。因为在示例DF中我们有3种语言:en,ua,ru;我们需要3个清单:
ids = [ 1, 2, 3, 4 ] # <-- list of IDs for reference
en = ["text1 text3", "text4", "text5", "text7"]
ua = ["", "text2", "text8", "" ]
ru = ["", "", "", "text6"]
文本列表应该与ID列表一样长,如果一个ID有多个文本,它们应该连接,如果没有,那么我们写一个空字符串。
到目前为止,我有这个Python解决方案:
import pandas as pd
my_table = pd.read_csv("my_data.csv", delimiter="\t")
en = list()
ua = list()
ru = list()
# iterate over unique ids only
for single_id in list(my_table.cluster_id.unique()):
# append a concatenated list of all texts given id and lang
en.append(" ".join(list(
my_table[(my_table["id"]==unicode(id))&(my_table["lang"]==unicode("en"))]["text"]
)))
ua.append(" ".join(list(
my_table[(my_table["id"]==unicode(id))&(my_table["lang"]==unicode("ua"))]["text"]
)))
de.append(" ".join(list(
my_table[(my_table["id"]==unicode(id))&(my_table["lang"]==unicode("ru"))]["text"]
)))
这很慢。有没有先在Pandas中进行过滤的方法,并以某种方式快速将其输出到单独的列表中?我需要Python列表作为输出。
编辑:这是在Python 2.7上
答案 0 :(得分:2)
IIUC
#df.groupby(['id','lang']).text.apply(list).unstack(-2)
df.groupby(['id','lang']).text.apply(','.join).unstack(-2)
Out[384]:
id 1 2 3 4
lang
en text1,text3 text4 text5 text7
ru None None None text6
ua None text2 text8 None
如果你想成为&#39;(dict)
df.groupby(['id','lang']).text.apply(','.join).unstack(-2).T.fillna('').to_dict('l')
Out[386]:
{'en': ['text1,text3', 'text4', 'text5', 'text7'],
'ru': ['', '', '', 'text6'],
'ua': ['', 'text2', 'text8', '']}
For Id
df.groupby(['id','lang']).text.apply(','.join).unstack(-2).columns.tolist()
Out[388]: [1, 2, 3, 4]