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