如何在熊猫中遍历列标题

时间:2019-03-05 21:03:27

标签: python pandas

我正在尝试遍历列标题并填充一个包含每个类别的平均收入的列表。 我收到此错误,并且尝试了很多其他尝试来修复它。 所以我的数据框看起来像这样(看起来我没有足够的点来粘贴图像,但这是它的链接): 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循环中执行genrev1

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'

我在这个问题上坚持了好几个星期,对此的任何帮助都会令人感激!!

5 个答案:

答案 0 :(得分:1)

欢迎来到stackoverflow!

我真的看不到需要在各列之间循环。循环通常是处理熊猫数据帧的低效方式,如果可能,应避免使用。考虑到这一点,我将提供其他解决方案。抱歉,如果您确实需要遍历各栏。如果您在问题中提供更多的背景信息,例如为什么选择了自己拥有的方法...您已经看过的地方以及为什么这种方法不起作用...这通常有助于引导人们更好地为您提供更多服务相关答案。

这就是我要做的...没有循环。

copy %1*.exe %2*.exe
copy %1pueblos.* %2pueblos.*
copy %1usuario.dbf %2usuario.dbf
copy %1usuario.cdx %2usuario.cdx
copy %1grupos.dbf %2grupos.dbf
copy %1grupos.cdx %2grupos.cdx
copy %1configuracion.dbf %2configuracion.dbf
copy %1*.dbc %2*.dbc
copy %1*.dct %2*.dct
copy %1*.dll %2*.dll
copy %1*.adx %2*.adx
copy %1*.cdt %2*.cdt

答案 1 :(得分:1)

* {
  box-sizing: border-box;
}

body {
  background: linear-gradient(to left, blue, pink);
  padding: 0;
  margin: 0;
}

.display {
  width: 150px;
  height: 40px;
  word-wrap: break-word;
}

.buttons {
  display: flex;
  flex-wrap: wrap;
  width: 280px;
}

button {
  text-align: center;
  font-size: 30px;
  margin: auto;
  padding: auto;
  height: 70px;
  width: 70px;
}

答案 2 :(得分:0)

您正在尝试在字符串中使用gen变量,但是您不能那样做。

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

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

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

genrev.append(df.query('%s == True' % gen)['revenue_adj'].mean())

您也可以直接遍历各列,而无需手动构建列表:

for col in df.columns:
...

答案 3 :(得分:0)

您可以尝试以下类似方法:

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

答案 4 :(得分:0)

我已经建立了两个流派的基本示例。我创建了一个列表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)]