【问题标题】:Alternatives to Dataframe.iterrows() or Dataframe.itertuples()?Dataframe.iterrows() 或 Dataframe.itertuples() 的替代品?
【发布时间】:2018-11-01 02:39:54
【问题描述】:

我对 Pandas 数据帧矢量化(通过 Pandas 矢量化本身或通过 Numpy)的理解是将函数应用于数组,类似于 .apply()(如果我错了,请纠正我)。假设我有以下数据框:

import pandas as pd
df = pd.DataFrame({'color' : ['red','blue','yellow','orange','green',
                         'white','black','brown','orange-red','teal',
                         'beige','mauve','cyan','goldenrod','auburn',
                         'azure','celadon','lavender','oak','chocolate'], 
               'group' : [1,1,1,1,1,
                          1,1,1,1,1,
                          1,2,2,2,2,
                          4,4,5,6,7]})
df = df.set_index('color')
df

对于这个数据,我想为 A 中的每个唯一值应用一个特殊的计数器。这是我当前的实现:

df['C'] = 0
for value in set(df['group'].values):
    filtered_df = df[df['group'] == value]
    adj_counter = 0
    initialize_counter = -1
    spacing_counter = 20
    special_counters = [0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7]
    for color,rows in filtered_df.iterrows():
        if len(filtered_df.index) < 7:
            initialize_counter +=1
            df.loc[color,'C'] = (46+special_counters[initialize_counter])

        else:
            spacing_counter +=1
            if spacing_counter > 5:
                spacing_counter = 0
            df.loc[color,'C'] = spacing_counter
df

有没有更快的方法来实现这个不涉及 iterrows 或 itertuples?由于 C 列中的计数非常不规则,我不确定如何通过 apply 甚至通过矢量化来实现这一点

【问题讨论】:

  • 为什么计数器在color == 'black'处归零?
  • 你能用文字解释一下计数器应该做什么吗?

标签: python pandas dataframe vectorization


【解决方案1】:

您可以做的是首先在“组”列上使用groupbycumcount 创建列“C”,这几乎代表spacing_counterinitialize_counter,具体取决于if len(filtered_df.index) &lt; 7

df['C'] = df.groupby('group').cumcount()

现在您需要选择适当的行来执行代码的ifelse 部分。一种方法是再次使用groupbytransform 创建一个系列,以了解与每一行相关的组的size。然后,使用这个系列在 df 上使用 loc 并执行以下操作:如果值小于 7,您可以使用 special_counters map 您的值,否则只需使用模 % 6

ser_size = df.groupby('group')['C'].transform('size')
df.loc[ser_size < 7,'C'] = df.loc[ser_size < 7,'C'].map(lambda x: 46 + special_counters[x])
df.loc[ser_size >= 7,'C'] %= 6

最后,你得到了预期的结果:

print (df)
            group   C
color                
red             1   0
blue            1   1
yellow          1   2
orange          1   3
green           1   4
white           1   5
black           1   0
brown           1   1
orange-red      1   2
teal            1   3
beige           1   4
mauve           2  46
cyan            2  47
goldenrod       2  45
auburn          2  48
azure           4  46
celadon         4  47
lavender        5  46
oak             6  46
chocolate       7  46

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2019-02-23
    • 2016-06-14
    相关资源
    最近更新 更多