将包含集合的数据框列的每一行转换为包含列表的列

时间:2018-08-14 13:58:45

标签: python-3.x pandas

我有一个看起来像这样的数据框df1:

cpc         count   gau
F21S41/32   5       {2875}
F21S41/147  21      {2875}
F21S41/692  20      {2875}
B60Q1/0041  15      {2683, 2875, 2844}
F21S43/40   15      {2875}
F21S41/435  14      {2875}

对于每一行,我想将计数乘以gau来生成一个名为w_gau的新列。

最终,我希望df1看起来像这样:

cpc         count   gau                 w_gau
F21S41/32   5      {2875}               ['2875', '2875', '2875', '2875', '2875'] 
F21S41/147  3      {2875}               ['2875', '2875', '2875']
F21S41/692  2      {2875}               ['2875', '2875']
B60Q1/0041  2      {2683, 2875, 2844}   ['2683', '2875', '2844', '2683', '2875', '2844', '2683', '2875', '2844']
F21S43/40   3      {2875}               ['2875', '2875', '2875']
F21S41/435  4      {2875}               ['2875', '2875', '2875', '2875']

我已经有代码将这些列表展平为一个列表并计算每个字符串的出现次数。

我的问题是如何将df1中的gau转换为可以乘以整数的列表的列表?

我尝试过:

In [16]: df1.gau.tolist()

但是,这会将列中的所有内容转换为一个列表。我需要每一行包含一个包含每个字符串的列表,或者int是列表中的一个字符串。

编辑:gau是字符串,而不是int

df1.dtypes
Out[24]: 
cpc      object
count     int64
gau      object
w_gau    object
dtype: object

3 个答案:

答案 0 :(得分:3)

当您在做这种愚蠢的事情时,您应该停下来并重新思考您的方法。

那是说,你要的剪刀在这里

df['gau'].apply(list) * df['count']

作为新列

df.assign(w_gau=df['gau'].apply(list) * df['count'])

如果您的gau列是字符串,请运行此命令将其转换为集合。

from ast import literal_eval

df['gau'] = df['gau'].apply(literal_eval)

然后运行其他代码。

答案 1 :(得分:2)

IIUC

df['New']=[list(x)*y for x, y in zip(df['gau'],df['Count'])]
df
Out[628]: 
   Count        gau                 New
0      1        {1}                 [1]
1      2  {1, 2, 3}  [1, 2, 3, 1, 2, 3]

数据输入

df=pd.DataFrame({'Count':[1,2],'gau':[{1},{1,2,3}]})

答案 2 :(得分:1)

将列表乘以整数时,将重现该列表。因此,您可以通过将gau中的元素转换为列表来找到自己的方式:

df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))

请注意,尽管将列表存储到pandas数据框中很少是一个好主意,但您可能要考虑采用其他方法。

编辑:

如果您有格式不正确的系列,则可以在literal_eval库中使用ast函数。并不是说这会浪费时间和精力,所以请尽量避免这种情况。

from ast import literal_eval
df['gau'] = df['gau'].apply(literal_eval)
df['w_gau'] = df['count']*df.gau.apply(lambda x: list(x))