遍历DataFrame中的行子集

时间:2018-09-10 18:23:31

标签: python pandas loops apply

我尝试使用一系列函数中最常用的元素来循环遍历DataFrame的低行。当我手动向其中提供系列时,该功能可以完美运行:

# Create DataFrame
df = pd.DataFrame({'a' : [1, 2, 1, 2, 1, 2, 1, 1],
              'b' : [1, 1, 2, 1, 1, 1, 2, 2],
              'c' : [1, 2, 2, 1, 2, 2, 2, 1]})

# Create function calculating most frequent element
from collections import Counter

def freq_value(series):
    return Counter(series).most_common()[0][0]

# Test function on one row
freq_value(df.iloc[1])

# Another test
freq_value((df.iloc[1, 0], df.iloc[1, 1], df.iloc[1, 2]))

通过两个测试,我都得到了期望的结果。但是,当我尝试在DataFrame行中循环应用此函数并将结果保存到新列中时,出现错误"'Series' object is not callable", 'occurred at index 0'。产生错误的行如下:

# Loop trough rows of a dataframe and write the result into new column
df['result'] = df.apply(lambda row: freq_value((row('a'), row('b'), row('c'))), axis = 1)

row()函数中的apply()到底如何工作?它不应该从列“ a”,“ b”,“ c”提供我的freq_value()函数值吗?

3 个答案:

答案 0 :(得分:2)

@jpp的答案解决了如何应用自定义功能,但是您也可以使用df.modeaxis=1获得所需的结果。这样可以避免使用apply,并且仍然会为您提供每一行最常见的值的列。

df['result'] = df.mode(1)

>>> df
   a  b  c  result
0  1  1  1       1
1  2  1  2       2
2  1  2  2       2
3  2  1  1       1
4  1  1  2       1
5  2  1  2       2
6  1  2  2       2
7  1  2  1       1

答案 1 :(得分:1)

row不是lambda中的函数,因此不适合使用括号,而应使用__getitem__方法或loc访问器来访问值。前者的语法糖是[]

df['result'] = df.apply(lambda row: freq_value((row['a'], row['b'], row['c'])), axis=1)

使用loc替代项:

def freq_value_calc(row):
    return freq_value((row.loc['a'], row.loc['b'], row.loc['c']))

要确切了解为什么是这种情况,它有助于将lambda重写为命名函数:

def freq_value_calc(row):
    print(type(row))  # useful for debugging
    return freq_value((row['a'], row['b'], row['c']))

df['result'] = df.apply(freq_value_calc, axis=1)

运行此命令,您会发现row的类型为<class 'pandas.core.series.Series'>,即如果使用axis=1,则该序列由列标签索引。要访问给定标签的系列值,可以使用__getitem__ / []语法或loc

答案 2 :(得分:0)

with tf.Session() as sess:
    with gfile.FastGFile(MODEL_NAME + '.frozen_graph.pb','rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        sess.graph.as_default()
        tf.import_graph_def(graph_def, name='')