【问题标题】:Multiply columns of a dataframe by getting the column names from a list通过从列表中获取列名来乘以数据框的列
【发布时间】:2019-03-07 19:30:58
【问题描述】:

我有一个数据框,其中有分类列和数值列。

data = [['A',"India",10,20,30,15,"Cochin"],['B',"India",10,20,30,40,"Chennai"],['C',"India",10,20,30,15,"Chennai"]]
df = pd.DataFrame(data,columns=['Product','Country',"2016 Total","2017 Total","2018 Total","2019 Total","Region"])

Product Country 2016 Total  2017 Total  2018 Total  2019 Total  Region
0   A   India   10           20          30          15         Cochin
1   B   India   10           20          30          40         Chennai
2   C   India   10           20          30          15         Chennai

我知道数值变量列的名称是什么(需要动态捕获):

start_year = 2016
current_year = datetime.datetime.now().year
previous_year = current_year - 1 
print(current_year)

year_list = np.arange(start_year, current_year+1, 1)

cols_list = []
for i in year_list:
    if i <= current_year:
        cols = str(i)+" Total"
        cols_list.append(cols)
cols_list

['2016 年总计', '2017 年总计', '2018 年总计', '2019 年总计']

我正在尝试确定相乘时 cols_list 列中的值是否为负

如何在 pandas 中做到这一点?我无法弄清楚如何遍历 cols_list 并从数据框中提取列并相乘

预期输出:

Product Country 2016 Total  2017 Total  2018 Total  2019 Total  Region  Negative
    0   A   India   10           20          30          15     Cochin No
    1   B   India   10           20          30          40    Chennai No
    2   C   India   10           20          30          15    Chennai No

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    numpy.whereDataFrame.prodSeries.lt 一起用于&lt;0

    #solution with f-strings for get cols_list by year arange
    cols_list = [f'{x} Total' for x in np.arange(start_year, current_year+1)]
    print (cols_list)
    ['2016 Total', '2017 Total', '2018 Total', '2019 Total']
    
    df['Negative'] = np.where(df[cols_list].prod(axis=1).lt(0), 'Yes', 'No')
    print (df)
      Product Country  2016 Total  2017 Total  2018 Total  2019 Total   Region  \
    0       A   India          10          20          30          15   Cochin   
    1       B   India          10          20          30          40  Chennai   
    2       C   India          10          20          30          15  Chennai   
    
      Negative  
    0       No  
    1       No  
    2       No  
    

    【讨论】:

      【解决方案2】:

      您可以使用df.filter() 过滤具有Total 的列(与您的cols_list 类似的结果),然后使用df.prod() 而不是axis=1,然后使用s.map()

      df['Negative']=df.filter(like='Total').prod(axis=1).lt(0).map({True:'Yes',False:'No'})
      print(df)
      
        Product Country  2016 Total  2017 Total  2018 Total  2019 Total   Region  \
      0       A   India          10          20          30          15   Cochin   
      1       B   India          10          20          30          40  Chennai   
      2       C   India          10          20          30          15  Chennai   
      
        Negative  
      0       No  
      1       No  
      2       No 
      

      【讨论】:

        【解决方案3】:

        试试这个:

        df['Negative'] = df[cols_list].T.product().apply(lambda x: x < 0)
        

        df[cols_list].T 将列转换为行。这样我们就可以将product 用于行(pandas 允许我们使用单个函数调用来完成)。

        一步一步:

        >>> t = df[cols_list].T
        >>> t
               0   1   2
        2016  10  10  10
        2017  20  20  20
        2018  30  30  30
        
        >>> p = t.product()
        >>> p
        0    6000
        1    6000
        2    6000
        dtype: int64
        
        >>> neg = p.apply(lambda x: x < 0)
        >>> neg
        0    False
        1    False
        2    False
        dtype: bool
        

        【讨论】:

          猜你喜欢
          • 2018-02-07
          • 2016-12-22
          • 2020-09-06
          • 1970-01-01
          • 2016-01-02
          • 1970-01-01
          • 2021-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多