我的第一个问题:我对pandas(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎将函数TWICE应用于数据帧的第一行.例如:
>>> from pandas import Series, DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]})
>>> print(df)
class count
0 A 1
1 B 0
2 C 2
Run Code Online (Sandbox Code Playgroud)
我首先检查groupby函数是否正常,看起来没问题:
>>> for group in df.groupby('class', group_keys = True):
>>> print(group)
('A', class count
0 A 1)
('B', class count
1 B 0)
('C', class count
2 C 2)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在groupby对象上使用apply做类似的事情,我得到第一行输出两次:
>>> def checkit(group):
>>> print(group)
>>> df.groupby('class', group_keys = True).apply(checkit)
class count
0 A 1
class count …Run Code Online (Sandbox Code Playgroud) 如果我有一个功能
def do_irreversible_thing(a, b):
print a, b
Run Code Online (Sandbox Code Playgroud)
还有一个数据帧
df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
对于pandas数据帧中的每一行,只 运行一次函数的最佳方法是什么?正如其他问题所指出的那样,像df.apply pandas这样的东西会在第一行调用该函数两次.即使使用numpy
np.vectorize(do_irreversible_thing)(df.a, df.b)
Run Code Online (Sandbox Code Playgroud)
导致函数在第一行被调用两次,df.T.apply()或者df.apply(...,axis = 1).
有没有比这个显式循环更快或更清晰的方法来调用每一行的函数?
for idx, a, b in df.itertuples():
do_irreversible_thing(a, b)
Run Code Online (Sandbox Code Playgroud) 我有一个函数的两个版本,Pandas用于逐行Python 2.7遍历inputs.csv.
第一个版本用于Series.apply()a single column,并按预期遍历每一行.
第二个版本使用DataFrame.apply()on multiple columns,由于某种原因,它读取顶行两次.然后继续执行其余的行而不重复.
任何想法为什么后者读取顶行两次?
版本#1 - Series.apply()
(读取顶行一次)
import pandas as pd
df = pd.read_csv(inputs.csv, delimiter=",")
def v1(x):
y = x
return pd.Series(y)
df["Y"] = df["X"].apply(v1)
Run Code Online (Sandbox Code Playgroud)
版本#2 - DataFrame.apply()
(读取顶行两次)
import pandas as pd
df = pd.read_csv(inputs.csv, delimiter=",")
def v2(f):
y = f["X"]
return pd.Series(y)
df["Y"] = df[(["X", "Z"])].apply(v2, axis=1)
Run Code Online (Sandbox Code Playgroud)
print y:
v1(x): v2(f):
Row_1 Row_1
Row_2 Row_1
Row_3 Row_2
Row_3
Run Code Online (Sandbox Code Playgroud)