【问题标题】:Convert each row of a dataframe column containing sets into a column containing lists将包含集合的数据框列的每一行转换为包含列表的列
【发布时间】:2018-08-14 22:20:21
【问题描述】:

我有一个如下所示的数据框 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

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    当你在做这样愚蠢的事情时,你应该停下来重新考虑你的方法。

    也就是说,你要了剪刀,它们就在这里

    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)
    

    然后运行其他代码。

    【讨论】:

    • true 我需要一种更好的方法来增加体重,但这就是我目前的做法。也就是说,当我尝试你的解决方案时,我没有得到我想要的答案。 ['{','2','6','8','3',',','','2','8','7','5',',','' , '2', '8', '4', '4', '}', '{', '2', '6', '8', '3', ',', '', '2 ', '8', '7', '5', ',', ' ', '2', '8', '4', '4', '}', '{', '2', ' 6','8','3',',','','2','8','7','5',',','','2','8',' 4', '4', '}', '{', '2', '6', '8', '3', ',', '', '2', '8',..., '}']
    • 这一定意味着你的项目是字符串。看我的更新。它应该清除它。
    • 工作,太棒了。谢谢
    【解决方案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}]})
    

    【讨论】:

    • 我忘了提到 gau 的类型是 string 而不是 int。我更新了问题。谢谢
    • @Britt 是一样的 :-)
    • 这实际上不起作用。 df5.New 的第一行如下所示: ['{', '2', '8', '7', '5', '}', '{', '2', '8', '7 ', '5', '}',...', '}']
    【解决方案3】:

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

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

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

    编辑:

    如果您有格式错误的系列,您可以使用astlibrary 中的literal_eval 函数。但这并不是说这很费时间和精力,所以尽量避免这些情况。

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

    【讨论】:

    • gau 包含字符串 not, int 所以这不起作用。我编辑了问题以反映这一点。谢谢
    • 我编辑了我的答案,添加了一行帮助您预先转换 gau 列中的值。
    猜你喜欢
    • 2019-07-01
    • 1970-01-01
    • 2022-12-11
    • 2016-02-14
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-02-20
    相关资源
    最近更新 更多