Python 熊猫:按分隔符拆分列,并基于其他列重新排列
让Python 熊猫:按分隔符拆分列,并基于其他列重新排列,python,pandas,filter,group-by,split,Python,Pandas,Filter,Group By,Split,让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
成为一个数据帧
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\u by
方法
有什么想法吗?如果只有两支球队,我们可以根据需要恢复比分 如果条件为真,则保持原始值。如果没有,它可以从值列表中调用输入值。我们的情况在团队中,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'})
您可以尝试以下方法:
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
这种方法很有趣,但最终的结果并不正确。它不反转第二行,例如,它没有为团队B给出[1,2,2,1],而是给出[1,1,2,1](在输出中显示为团队A)。对不起,我有两个版本:一个输入了lambda,另一个先反转。似乎由于某种原因,callable不起作用,我将其编辑成一个版本,在这个版本中,您可以反转所有内容,然后选择正确的内容。
Team A Team B
0 3 1
1 1 2
2 2 2
3 0 1