Pandas:通过分隔符拆分列并根据其他列重新排列

Posted

技术标签:

【中文标题】Pandas:通过分隔符拆分列并根据其他列重新排列【英文标题】:Pandas: Splitting a column by delimiter and re-arrenging based on other columns 【发布时间】:2020-11-01 18:37:04 【问题描述】:

df 成为一个数据框。

In [1]: import pandas as pd
   ...: df = pd.DataFrame(columns = ['Home', 'Score', 'Away'])
   ...: df.loc[0] = ['Team A', '3-1', 'Team B']
   ...: df.loc[1] = ['Team B', '2-1', 'Team A']
   ...: df.loc[2] = ['Team B', '2-2', 'Team A']
   ...: df.loc[3] = ['Team A', '0-1', 'Team B']

In [2]: df
Out[2]:
     Home Score    Away
0  Team A   3-1  Team B
1  Team B   2-1  Team A
2  Team B   2-2  Team A
3  Team A   0-1  Team B

我想用df 制作df_1

In [4]: df_1
Out[4]:
  Team A Team B
0      3      1
1      1      2
2      2      2
3      0      1

最简单的方法是什么?

作为初学者,我可以将'Score' 列拆分为两列,然后遍历其他列并得到df_1,但我想应该有更简单的方法,可能是lambda函数或group_by 方法。

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果只有两队,我们可以根据需要恢复分数。

where函数的作用如下,如果条件为真,则保持原值。如果没有,它可以从值列表中调用输入值。我们的条件是对队,mapper是一个字符串的反转。

l_rev_string = lambda s: s[::-1]

df_score_rev = df.Score.apply(l_rev_string)

df1 = df.Score.where(df.Home == 'Team A', df_score_rev)\
    .str.split('-',expand=True)\
    .rename(columns = 0:'Team A',1:'Team B')


|    |   Team A |   Team B |
|---:|---------:|---------:|
|  0 |        3 |        1 |
|  1 |        1 |        2 |
|  2 |        2 |        2 |
|  3 |        0 |        1 |

【讨论】:

方法很有趣,但最终结果不正确。它不会反转第二行,而不是例如为团队 B 给出 [1, 2, 2, 1],而是给出 [1, 1, 2, 1](在您的输出中显示为团队 A)。 抱歉,我有两个版本:一个输入了 lambda,一个先反转。似乎由于某种原因,可调用对象不起作用,我将其编辑为一个版本,您可以在其中反转所有内容并挑选正确的版本。【参考方案2】:

你可以试试这个:

df["values"] = df.apply(lambda row: row["Home"]:row["Score"].split("-")[0], row["Away"]:row["Score"].split("-")[1], axis=1)

output_df = pd.DataFrame(df["values"].tolist())

输出:

    Team A  Team B
0   3   1
1   1   2
2   2   2
3   0   1

【讨论】:

以上是关于Pandas:通过分隔符拆分列并根据其他列重新排列的主要内容,如果未能解决你的问题,请参考以下文章

根据分隔符拆分列,然后在保留其他列的情况下取消透视结果

如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示

Pandas - 如果不存在分隔符,则使用默认值拆分列

awk 拆分更多列并打印第一个单词

根据多个条件将一列拆分为几列并分组

Pandas:将特定功能应用于列并创建其他列