【问题标题】:Splitting a dataframe column into multiple columns with specific names将数据框列拆分为具有特定名称的多个列
【发布时间】:2021-01-29 14:24:24
【问题描述】:

我正在尝试将数据框列拆分为多个列,如下所示:

  1. 总共有三列。两个应在新数据框中重命名,而第三个应拆分为新列。
  2. 使用特定字符(例如“:”)进行拆分
  3. 需要拆分的列可以有不同数量的“:”拆分。因此,对于不同的行,新列可能会有所不同,而对于某些行,某些列的值会保留为 NULL。没关系。
  4. 随后形成的每个列都有一个特定的名称。可以形成的最大列数是已知的。
  5. 有四个数据帧。每个都有相同的格式列,必须拆分。

我遇到了以下解决方案,但由于上述原因它们不起作用:

  1. Link

    pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)

    • 这会创建名称为 0、1、2 的列...我需要新列具有特定名称。
  2. Link

    df = df.apply(lambda x:pd.Series(x))

    • 这不会改变数据框。不明白为什么。
  3. Link

    df['command'], df['value'] = df[0].str.split().str

    • 此处列名已正确重命名,但这需要事先知道将形成多少列。就我而言,它对于每个数据帧都是动态的。对于行,拆分成功地将 NULL 值放入额外的列中。但是对另一个数据帧使用相同的代码会产生一个错误,提示键的数量应该相同。

我无法在这些答案上发布 cmets,因为我是这个社区的新手。如果有人能帮助我了解如何实现我的目标,我将不胜感激 - 即:在将新生成的列重命名为预定义名称的同时,动态地使用相同的代码将一列拆分为多个用于不同的数据帧。

例如:

数据框 1:

    Col1    Col2            Col3
0   A       A:B:C           A
1   A       A:B:C:D:E       A
2   A       A:B             A

数据框 2:

    Col1    Col2            Col3
0   A       A:B:C           A
1   A       A:B:C:D         A
2   A       A:B             A

输出应该是: 新数据框 1:

    Col1   ColA   ColB   ColC   ColD   ColE   Col3
0   A      A      B      C      NaN    NaN    A
1   A      A      B      C      D      E      A
2   A      A      B      NaN    NaN    NaN    A

新数据框 2:

    Col1   ColA   ColB   ColC   ColD   ColE   Col3
0   A      A      B      C      NaN    NaN    A
1   A      A      B      C      D      NaN    A
2   A      A      B      NaN    NaN    NaN    A

(如果没有ColE,那也没关系。)

在此之后,我将把这些数据帧连接成一个,我将需要针对 Col1 和 Col3 组合的单个数据帧的所有 ColA 到 ColE 的计数。所以,我们需要牢记这一点。

【问题讨论】:

  • 输出示例的顺序是否错误?
  • 是的。对此感到抱歉。更新的问题。
  • 我的回答对你有帮助吗?
  • @PabloC 嘿。感谢您的回复。是的一部分。实际数据和列名与示例不同。所以我们不需要初始最大拆分来获取列名。我仍然必须手动从所有数据框中获取最大列数来决定列名。发布后,我这样做:df = pd.concat([df[old_columns], df[column_for_split].str.split(':', expand=True)], axis=1) 并以任一方式重命名列:df = df.rename(columns= {0: name1, 1: name2, 2: name3, 3: name4...})df.columns = [old_columns,new_columns]

标签: python pandas dataframe split


【解决方案1】:

你可以这样做:

columns = df.Col2.max().split(':')
#['A', 'B', 'C', 'D', 'E']

new = df.Col2.str.split(":", expand = True)
new.columns = columns
new = new.add_prefix("Col")

df.join(new).drop("Col2", 1)
#  Col1 Col3 ColA ColB  ColC  ColD  ColE
#0    A    A    A    B     C  None  None
#1    A    A    A    B     C     D     E
#2    A    A    A    B  None  None  None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多