首页 > 解决方案 > 带有列表命名的forloop python

问题描述

嗨,我正在尝试执行 forloop

    concatted  score       date status  apple  banana  orange
0  apple_bana  0.500 2010-02-20   high   True   False   False
1       apple  0.400 2010-02-10   high   True   False   False
2      banana  0.530 2010-01-12   high  False    True   False
3        kiwi  0.532 2010-03-03    low  False   False   False
4        cake  0.634 2010-03-05    low  False   False   False 

df = df.drop(['banana', 'orange'], axis=1)

df['apple_count'] = df.groupby([pd.Grouper(key='date', freq='D')])
df["apple_high"] = df.groupby('date')['status'].transform(lambda x: (x=='high').sum())
fig = plt.figure()
plt.plot(df['date'], df['apple_count'])
fig.suptitle('Apple Graph', fontsize=20)

此代码适用于苹果。但是我怎么能做一个forloop:

fruits = ['apple', 'banana', 'orange']
for fruit in fruits:

循环需要:

  1. 如果相应水果的列 =True,则首先只保留行
  2. 执行 2 次计算,分别以“fruit”为前缀命名列和图形。

标签: pythonpandasdataframefor-loopforeach

解决方案


你可以复制fruitsremove(fruit)

all_fruits = ['apple', 'banana', 'orange']

for fruit in all_fruits:
    drop_fruits = all_fruits.copy()
    drop_fruits.remove(fruit)

    print('to drop:', drop_fruits)

结果:

to drop: ['banana', 'orange']
to drop: ['apple', 'orange']
to drop: ['apple', 'banana']

或者你可以使用set() - set()

all_fruits = ['apple', 'banana', 'orange']

for fruit in all_fruits:
    drop_fruits = list(set(all_fruits) - set( [fruit] ))

    print('to drop:', drop_fruits)

但这一切都需要在df之前复制droping。也许更好的是使用

new_df = df[ ['concatted', 'score', 'date', 'status', fruit] ]

和这个一起工作new_df

... = new_df.groupby(...)

然后

df[ fruit + '_count' ] = ...
df[ fruit + '_high' ] = ...

或者

df[ '{}_count'.format(fruit) ] = ...
df[ '{}_high'.format(fruit) ] = ...

或使用f-string

df[ f'{fruit}_count' ] = ...
df[ f'{fruit}_high' ] = ...

推荐阅读