我正在尝试用Pandas获取dataframe df的行数,这是我的代码.
total_rows = df.count
print total_rows +1
Run Code Online (Sandbox Code Playgroud)
total_rows = df['First_columnn_label'].count
print total_rows +1
Run Code Online (Sandbox Code Playgroud)
两个代码片段都给我这个错误:
TypeError:+:'instancemethod'和'int'的不支持的操作数类型
我究竟做错了什么?
我不知道为什么这会让NaN进入"新"栏目?
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
Run Code Online (Sandbox Code Playgroud) 我尝试将文件读入熊猫.该文件的值由空格分隔,但我尝试的空格数不同:
pd.read_csv('file.csv', delimiter=' ')
Run Code Online (Sandbox Code Playgroud)
但它不起作用
我正在尝试将多处理与pandas数据帧一起使用,即将数据帧拆分为8个部分.使用apply(每个部分在不同的过程中处理)对每个部分应用一些功能.
编辑:这是我最终找到的解决方案:
import multiprocessing as mp
import pandas.util.testing as pdt
def process_apply(x):
# do some stuff to data here
def process(df):
res = df.apply(process_apply, axis=1)
return res
if __name__ == '__main__':
p = mp.Pool(processes=8)
split_dfs = np.array_split(big_df,8)
pool_results = p.map(aoi_proc, split_dfs)
p.close()
p.join()
# merging parts processed by different processes
parts = pd.concat(pool_results, axis=0)
# merging newly calculated parts to big_df
big_df = pd.concat([big_df, parts], axis=1)
# checking if the dfs were merged correctly
pdt.assert_series_equal(parts['id'], big_df['id'])
Run Code Online (Sandbox Code Playgroud) 我有一个数据帧,在行和列'xpos','ypos'中有连续的像素坐标,我想计算连续像素之间每条路径的角度.目前我有下面提供的解决方案,它工作正常,我的文件的大小足够快,但迭代所有行似乎不是熊猫的方式来做到这一点.我知道如何将函数应用于不同的列,以及如何将函数应用于不同的列行,但无法弄清楚如何将两者结合起来.
这是我的代码:
fix_df = pd.read_csv('fixations_out.csv')
# wyliczanie k?ta sakady
temp_list=[]
for count, row in df.iterrows():
x1 = row['xpos']
y1 = row['ypos']
try:
x2 = df['xpos'].ix[count-1]
y2 = df['ypos'].ix[count-1]
a = abs(180/math.pi * math.atan((y2-y1)/(x2-x1)))
temp_list.append(a)
except KeyError:
temp_list.append(np.nan)
Run Code Online (Sandbox Code Playgroud)
然后我将临时列表插入到df中
编辑:实施我的评论提示后:
df['diff_x'] = df['xpos'].shift() - df['xpos']
df['diff_y'] = df['ypos'].shift() - df['ypos']
def calc_angle(x):
try:
a = abs(180/math.pi * math.atan((x.diff_y)/(x.diff_x)))
return a
except ZeroDivisionError:
return 0
df['angle_degrees'] = df.apply(calc_angle, axis=1)
Run Code Online (Sandbox Code Playgroud)
我比较了我的df的三个解决方案的时间(df的大小约为6k行),迭代几乎比应用慢9倍,比没有应用时慢了大约1500倍:
迭代的解决方案的执行时间,包括将新列插回到df:1,51s
没有迭代的解决方案的执行时间,应用:0.17s
EdChum使用diff()接受答案的执行时间,没有迭代且没有应用:0.001s
建议:不要使用迭代或应用,并始终尝试使用矢量化计算;)它不仅更快,而且更具可读性.