如何迭代pandas中的列标题

2024-04-29 10:05:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试遍历列标题并填充一个包含每个类别的平均收入的列表。 我遇到了这个错误,我尝试了很多不同的方法来修复它。 所以我的数据框如下所示(看起来我没有足够的点来粘贴图像,但这里有一个链接): each row in the dataframe represent an idividual movie. column revenue_adj populated with revenue values, one column for each genre populated with TRUE/FALSE indicating that the movie falls under that specific genre.

这段代码工作得很好,但我希望在for循环中而不是在steadgenrev1中执行

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

我尝试了以下循环,但没有成功:

^{pr2}$

我得到一个错误说“gen is not defined” 而不是gen,我尝试过:

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

我已经坚持了好几个星期了,如果有任何帮助,我将不胜感激!!在


Tags: thetruedffor错误withcolumnmovie
3条回答

欢迎来到stackoverflow!在

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

下面是我该怎么做。。。没有循环。在

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

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

一种解决方法是将行更改为:

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

假设您使用的是python3.6或更高版本。旧版本可以:

genrev.append(df.query('%s == True' % gen)['revenue_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()

输出:

^{pr2}$

相关问题 更多 >