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:通过分隔符拆分列并根据其他列重新排列的主要内容,如果未能解决你的问题,请参考以下文章