我尝试使用一系列函数中最常用的元素来循环遍历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()
函数值吗?
答案 0 :(得分:2)
@jpp的答案解决了如何应用自定义功能,但是您也可以使用df.mode
和axis=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='')