将列拆分为Pandas

时间:2018-03-13 14:23:40

标签: python pandas dataframe

我有以下示例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上

1 个答案:

答案 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]