Python 如何遍历pandas中的列标题

Python 如何遍历pandas中的列标题,python,pandas,Python,Pandas,我试图遍历列标题并填充一个包含每个类别的平均收入的列表。 我遇到了这个错误,我尝试了很多不同的方法来修复它。 所以我的数据框看起来像这样(看起来我没有足够的点来粘贴图像,但这里有一个链接): 这段代码运行良好,但我希望在for循环中而不是在teadgenrev1中执行 genrev1= df.query('action == True')['revenue_adj'].mean() genrev2 = df.query('adventure == True')['revenue_adj'].m

我试图遍历列标题并填充一个包含每个类别的平均收入的列表。 我遇到了这个错误,我尝试了很多不同的方法来修复它。 所以我的数据框看起来像这样(看起来我没有足够的点来粘贴图像,但这里有一个链接):

这段代码运行良好,但我希望在for循环中而不是在teadgenrev1中执行

genrev1= df.query('action == True')['revenue_adj'].mean()
genrev2 = df.query('adventure == True')['revenue_adj'].mean()
genrev3 = df.query('animation == True')['revenue_adj'].mean()
genrev4 = df.query('comedy == True')['revenue_adj'].mean()
genrev5 = df.query('crime == True')['revenue_adj'].mean()
genrev6 = df.query('documentary == True')['revenue_adj'].mean()
genrev7 = df.query('drama == True')['revenue_adj'].mean()
genrev8 = df.query('family == True')['revenue_adj'].mean()
我尝试了以下循环,但没有成功:

genheads = ['action', 'adventure', 'animation', 'comedy', 'crime', 'documentary', 'drama', 'family']

genres2 = genheads
genrev = []
for gen in genres2:
    genrev.append(df.query('gen == True')['revenue_adj'].mean())
我收到一个错误,说“gen未定义” 我没有选择gen,而是尝试了:

df[gen] == True
'@df[gen] == True'
'@gen == True'

我被困在这几个星期和任何帮助这将是非常感谢

您试图在字符串中使用变量gen,但不能这样做

一个解决方案是将线路更改为:

genrev.append(df.query(f'{gen}==True')['revenue_adj'].mean())

假设您使用的是python 3.6或更高版本。旧版本您可以执行以下操作:

genrev.append(df.query('%s==True'%gen)['revenue\u adj'].mean())

您也可以直接迭代列,而不是手动构建列表:

for col in df.columns:
...

您可以尝试以下方法:

df = pd.DataFrame({'Revenue':np.arange(100,1001,100),
                   'action':np.random.choice([True, False],10),
                   'comedy':np.random.choice([True, False],10),
                   'drama':np.random.choice([True, False],10)})

df.iloc[:,1:].apply(lambda x: pd.Series(df.loc[x,'Revenue'])).mean()
输出:

action    500.0
comedy    587.5
drama     420.0
dtype: float64

我已经用两种类型建立了一个基本示例。我创建了一个列表,genre_-mean,它将该流派及其平均收入存储为一个元组。如果您只是想存储平均收入,那么可以调整genre_mean.append()语句

movies = pd.DataFrame({"adj_rev": [10,20,30],
                       "action": ["TRUE", "FALSE", "TRUE"],
                       "comedy": ["FALSE", "TRUE", "FALSE"]})

genres = ["action", "comedy"]

genre_mean = []

for g in genres:
    g_mean = movies["adj_rev"][movies[g]=="TRUE"].mean()
    genre_mean.append((g, g_mean))
结果如何

genre_mean
[('action', 20.0), ('comedy', 20.0)]

欢迎来到stackoverflow

我真的不认为有必要在列上循环。循环通常是处理数据帧的低效方法,如果可能,应避免使用循环。考虑到这一点,我将提供一个不同的解决方案。如果您真的需要在列上循环,请道歉。如果你在问题中提供多一点背景,说明你为什么选择了你所选择的方法。。。你已经找过的地方,为什么没用。。。它通常有助于更好地引导人们给你更相关的答案

我会这样做的。。。没有循环

import pandas as pd
import numpy as np

# mimick something similar to your data
arr = [
    [1.2, True, False, True],
    [2.3, False, True, True],
    [3.4, True, True, False]
]
genres = ['action', 'adventure', 'comedy']
df = pd.DataFrame(arr, columns=['rev'] + genres)

# perform your task
result = df.loc[:, genres]            # take just the genre columns
result = result.astype('int')         # convert boolean to int
result[result == 0] = np.nan          # convert 0's to nulls so they're excluded from the avg
result = result.mul(df.rev, axis=0)   # multiply by your 'rev' column
result = result.mean(axis=0)          # calc mean for all genres simultaneously

result
# action       2.30
# adventure    2.85
# comedy       1.75

即使这个问题需要循环,你的答案还是很有用的。不惜一切代价消除for循环
for column in df:
         print(df[column])