【问题标题】:Pandas: Splitting a column by delimiter and re-arrenging based on other columnsPandas:通过分隔符拆分列并根据其他列重新排列
【发布时间】: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 方法。

有什么想法吗?

【问题讨论】:

    标签: python pandas filter group-by split


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2013-02-27
      • 2018-10-25
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多