【问题标题】:Split multiple columns into new rows将多列拆分为新行
【发布时间】:2020-02-16 12:25:23
【问题描述】:

我在将两列拆分为新行时遇到问题。

我的数据框是这样的

“involved”和“team_player_formation”各有 15 个字符串,需要分配到各自的行中。与“involved”的第一个字符串匹配“team_player_formation”的第一个字符串

我曾尝试遵循:Split (explode) pandas dataframe string entry to separate rows 并寻找拆分多列的方法,但没有成功

目前我已经能够将我的一个专栏与以下内容分开

df = pd.read_csv('Hello.csv',  delimiter=';')
df = df.assign(involved=df['involved'].str.split(',')).explode('involved')

这给了我这样的东西:

     matchId                                contestantId periodId typeId    involved    team_formation  team_player_formation
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  b2492j7qzdo7g3ysxz6gq4g5x   4   1
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  b2492j7qzdo7g3ysxz6gq4g5x   4   1
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  b2492j7qzdo7g3ysxz6gq4g5x   4   1
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  b2492j7qzdo7g3ysxz6gq4g5x   4   1
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  b2492j7qzdo7g3ysxz6gq4g5x   4   1
    ..................

    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  am3509ake84cde1xhb9264i22   4   0
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  am3509ake84cde1xhb9264i22   4   0
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  am3509ake84cde1xhb9264i22   4   0
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  am3509ake84cde1xhb9264i22   4   0
    0   d5321qxmnyf9004i049uf4pre   77tfx9me4aaqhzv78bmgsy9bg   2   40  am3509ake84cde1xhb9264i22   4   0

但这只会将“involed”拆分为一个新列。

输出应该是这样的,我只显示了前 3 行。

谢谢!我希望你能提供帮助,我解释得很好。

【问题讨论】:

  • 您可以将输入数据粘贴为文本吗?
  • 根据 Scott 的要求,您还能注意一下您使用的是哪个 Pandas 版本吗?你想要的输出中重复的列标题是必要的,还是只是为了说明?谢谢!
  • 大家好。是的,所有重复的列都是必需的。我正在将 python 3.7 与最新版本的 Pandas 一起使用。刚刚更新了。您看到的图片是我刚刚在 excel 中将其快速编辑为文本以用于说明目的的地方。但这只是我需要进行相同编辑的众多示例之一。谢谢!

标签: python pandas split


【解决方案1】:

如果我正确理解了您的问题,您可以使用此 MCVE 来帮助您进行分析。

df = pd.DataFrame({'ID':[1],'string1':['A,B,C'], 'string2':['X,Y,Z']}, index=[0])

df_joined = df.join([df['string1'].str.split(',', expand=True).add_prefix('s1_'), 
                     df['string2'].str.split(',', expand=True).add_prefix('s2_')])

pd.wide_to_long(df_joined, ['s1','s2'], 'ID', 'No', sep='_').reset_index()

输出:

   ID  No string1 string2 s1 s2
0   1   0   A,B,C   X,Y,Z  A  X
1   1   1   A,B,C   X,Y,Z  B  Y
2   1   2   A,B,C   X,Y,Z  C  Z

【讨论】:

  • 对您的评论 Scott Boston。我发布的代码的错误如下:----> 4 pd.wide_to_long(df_joined, ['s1','s2'], sep='_').reset_index() TypeError: wide_to_long() 缺少 2 个必需的位置参数:'i' 和 'j'
  • 什么版本的熊猫?如果可能,请升级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多