我正在使用df.iterrows或df.itertuples遍历大型数据框。我正在遵循以下链接中要求的示例:
这里是[链接](Python Pandas iterate over rows and access column names)
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
print df
A B C D
0 0.351741 0.186022 0.238705 0.081457
1 0.950817 0.665594 0.671151 0.730102
2 0.727996 0.442725 0.658816 0.003515
3 0.155604 0.567044 0.943466 0.666576
4 0.056922 0.751562 0.135624 0.597252
5 0.577770 0.995546 0.984923 0.123392
6 0.121061 0.490894 0.134702 0.358296
7 0.895856 0.617628 0.722529 0.794110
8 0.611006 0.328815 0.395859 0.507364
9 0.616169 0.527488 0.186614 0.278792
从上面的数据框中,我尝试引用特定的列和行(例如上一行),但出现错误。例如:
for row in df.iterrows():
if row.loc[1,'A'] > 0.95:
temp_val = row.loc[0,'A']
else:
temp_val = row.loc[0,'B']
谢谢!
答案 0 :(得分:1)
您可以使用np.where
和DataFrame.shift
更有效地做到这一点:
import numpy as np
np.where(df['A'].gt(0.95), df['A'].shift(), df['B'].shift())
您的代码存在的问题是df.iterrows()
返回一个tuple
,其中第一个元素是索引,第二个元素是Series
,因此您无法直接对其进行索引。这是一种您可以做到的方式:
df['result'] = np.nan
for ix, row in df.loc[1:,:].iterrows():
if row.loc['A'] > 0.95:
df.loc[ix, 'result'] = df.loc[ix-1,'A']
else:
df.loc[ix, 'result'] = df.loc[ix-1,'B']