【问题标题】:R and/or Pandas-Python Function to Create a New Variable Based on Conditions if a Different Variable如果变量不同,R 和/或 Pandas-Python 函数可根据条件创建新变量
【发布时间】:2021-01-25 14:08:10
【问题描述】:

我无法找到解决问题的正确方法。 我有一个 NBA 数据集,其中列/变量之一是球员的位置。例如,C 代表中锋,SG 代表得分后卫,SG-SF 代表得分后卫/小福拉德。我的目标是为篮球中的每个位置创建 5 个新变量:PG、SG、SF、PF、C,其中球员在新位置列在原始数据集中列出的每一列中的值为 1。

例如,Tyson Chandler 在新的 C 列中为 1,但在 PG、SF、SF 和 PF 中为 0。

我查看了 dpylr 的 mutate 和类似方法,但它们似乎倾向于根据该列中已经存在的数据条件来编辑列,而不是检查不同列中的条件。

我发现的临时解决方法是将数据帧拆分为更小的数据帧,并为每个位置组添加适当的值,然后将子数据帧重新组合到完整的数据帧中。不过,我希望能找到更优雅的解决方案。

谢谢。

【问题讨论】:

  • 您对dplyr::mutate“根据该列中已存在的数据的条件编辑列”)的解释不正确。虽然dplyr.tidyverse.org/reference/mutate.html 的前几个示例并没有反驳您的说法,但它确实在稍后显示mutate(z = x + y),这就是您要问的。

标签: python r pandas


【解决方案1】:

使用 pandas,有一个简短的迭代解决方案。

首先,让我们构建一个名为df的测试数据框:

import pandas as pd

df = pd.DataFrame(
    [
        ['Player1', 'PG'],
        ['Player2', 'SG'],
        ['Player3', 'SF'],
        ['Player4', 'PF'],
        ['Player5', 'C'],
        ['Player6', 'PG'],
        ['Player7', 'SF'],
        ['Player8', 'PF'],
        ['Player9', 'C'],
    ],
    columns=['name', 'position']
)

df

Out[1]: 
      name position
0  Player1       PG
1  Player2       SG
2  Player3       SF
3  Player4       PF
4  Player5        C
5  Player6       PG
6  Player7       SF
7  Player8       PF
8  Player9        C

然后,我们使用transform 方法创建新列(循环位置)。 对于每一列,我们使用一个 lambda 函数,如果位置与该列匹配,则返回 1,否则返回 0:

for pos in ['PG', 'SG', 'SF', 'PF', 'C']:
    df[pos] = df['position'].transform(lambda p: 1 if p == pos else 0)

df

Out[2]: 
      name position  PG  SG  SF  PF  C
0  Player1       PG   1   0   0   0  0
1  Player2       SG   0   1   0   0  0
2  Player3       SF   0   0   1   0  0
3  Player4       PF   0   0   0   1  0
4  Player5        C   0   0   0   0  1
5  Player6       PG   1   0   0   0  0
6  Player7       SF   0   0   1   0  0
7  Player8       PF   0   0   0   1  0
8  Player9        C   0   0   0   0  1

【讨论】:

    【解决方案2】:

    您基本上是在问如何对列进行一次热编码。 Scikit learn 有一个预处理来做到这一点。但老实说,最简单的方法是使用Pandas 内置函数和.get_dummies。然后将其加入原始数据框:

    阅读 here 以在 R 中实现。

    import pandas as pd
    
    df = pd.DataFrame(
        [
            ['Player1', 'PG'],
            ['Player2', 'SG'],
            ['Player3', 'SF'],
            ['Player4', 'PF'],
            ['Player5', 'C'],
            ['Player6', 'PG'],
            ['Player7', 'SF'],
            ['Player8', 'PF'],
            ['Player9', 'C'],
        ],
        columns=['name', 'position']
    )
    
    encoded = pd.get_dummies(df['position'])
    encoded_df = df.join(encoded)
    

    输出:

    print(encoded)
       C  PF  PG  SF  SG
    0  0   0   1   0   0
    1  0   0   0   0   1
    2  0   0   0   1   0
    3  0   1   0   0   0
    4  1   0   0   0   0
    5  0   0   1   0   0
    6  0   0   0   1   0
    7  0   1   0   0   0
    8  1   0   0   0   0
    

    合并在一起:如果需要,您也可以删除 'position'

    print(merged_df)
          name position  C  PF  PG  SF  SG
    0  Player1       PG  0   0   1   0   0
    1  Player2       SG  0   0   0   0   1
    2  Player3       SF  0   0   0   1   0
    3  Player4       PF  0   1   0   0   0
    4  Player5        C  1   0   0   0   0
    5  Player6       PG  0   0   1   0   0
    6  Player7       SF  0   0   0   1   0
    7  Player8       PF  0   1   0   0   0
    8  Player9        C  1   0   0   0   0
    

    作为单行:

    encoded_df = df.join(pd.get_dummies(df['position']))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      相关资源
      最近更新 更多