【问题标题】:Is there any possibility to create a new column based on the keywords list是否有可能根据关键字列表创建新列
【发布时间】:2021-04-19 11:27:19
【问题描述】:

是否有可能根据关键字列表创建新列?

Keywords = ["A", "B"]

我有这样的数据:

Location             Type          
Ger                  A          
Ger                  F
Ger                  C     
Ned                  D
Ned                  A
Ned                  B
Aus                  C
US                   B

如果关键字存在于 Type 列中,并且如果存在 2 个关键字,那么我想创建一个新列,那么值应该都是关键字和逗号。我遇到了问题,因为我还必须先检查位置,然后输入...

Location             Type          NewType
Ger                  A             A
Ger                  F             A
Ger                  C             A
Ned                  D             A,B
Ned                  A             A,B
Ned                  B             A,B
Aus                  C             NaN
US                   B             B

除了if-else还有什么办法吗?

【问题讨论】:

    标签: python pandas list conditional-statements


    【解决方案1】:

    您可以创建一个函数并将其应用于df['Location']

    def func(x):
        temp=list(df[df.Location==x]['Type'])
        return ','.join(i for i in Keywords if i in temp)
    
    df['NewType']=df.Location.apply(lambda x: func(x))
    df['NewType'].replace('', np.nan, inplace=True)
    print(df) 
    

    输出:

      Location Type NewType
    0      Ger    A       A
    1      Ger    F       A
    2      Ger    C       A
    3      Ned    D     A,B
    4      Ned    A     A,B
    5      Ned    B     A,B
    6      Aus    C     NaN
    7       US    B       B
    

    【讨论】:

      【解决方案2】:

      让我们使用groupbymap

      m = df['Type'].isin(keywords)
      s = df[m].groupby('Location')['Type'].agg(','.join)
      df['NewType'] = df['Location'].map(s)
      

      详情:

      使用.isin 创建布尔掩码以测试Type 中存在于keywords 列表中的值:

      print(m)
      
      0     True
      1    False
      2    False
      3    False
      4     True
      5     True
      6    False
      7     True
      Name: Type, dtype: bool
      

      使用上面的掩码过滤行,Location 上的 groupby 然后 agg Type 使用 join

      print(s)
      
      Location
      Ger      A
      Ned    A,B
      US       B
      Name: Type, dtype: object
      

      .map 上述聚合帧中的值到基于Location 的原始df

      print(df)
      
        Location Type NewType
      0      Ger    A       A
      1      Ger    F       A
      2      Ger    C       A
      3      Ned    D     A,B
      4      Ned    A     A,B
      5      Ned    B     A,B
      6      Aus    C     NaN
      7       US    B       B
      

      【讨论】:

      • 感谢您的解决方案。有一个问题是,如果“类型”有 2 次重复值,那么它会显示为 A,A,这是我不想要的……有什么解决方案吗?
      • @s_khan92 您可以在创建 boolean mask like m = df['Type'].isin(keywords) & ~df.duplicated() 时测试重复项。
      • 仍然得到相同的重复值
      • @s_khan92 实际数据框中的列是否超过两列?如果是这样,那么您必须使用m = df['Type'].isin(keywords) & ~df.duplicated(['Location', 'Type'])
      • 是的.. 4 列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2019-01-04
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多