通过从列表中获取列名称来乘以数据框的列

时间:2019-03-07 11:07:05

标签: python-3.x pandas dataframe

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

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 Total','2017 Total','2018 Total','2019 Total']

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

如何在熊猫中做到这一点?我无法弄清楚如何遍历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

3 个答案:

答案 0 :(得分:3)

您可以使用df.filter()来过滤具有Total的列(与您的cols_list类似的结果),然后在axis=1上使用df.prod(),然后使用{{1 }}:

s.map()

答案 1 :(得分:3)

numpy.whereDataFrame.prod的条件与{{1}一起使用Series.lt

<0

答案 2 :(得分:1)

尝试一下:

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

那里的df[cols_list].T将列转置为行。这样,我们可以将product用作行(熊猫可以通过一个函数调用来完成)。

分步操作:

>>> 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