python - 迭代数据框时如何引用行和列
问题描述
我正在使用 df.iterrows 或 df.itertuples 迭代一个大型数据框。我正在按照以下链接中提出的示例进行操作:
这是 [a link](Python Pandas 遍历行并访问列名)
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']
谢谢!
解决方案
np.where
您可以使用and更有效地做到这一点DataFrame.shift
:
import numpy as np
np.where(df['A'].gt(0.95), df['A'].shift(), df['B'].shift())
您的代码的问题df.iterrows()
是返回 a tuple
,其中第一个元素是索引,第二个元素是 a 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']
推荐阅读
- java - 用 list.add(index, value) 修改后 ListNode 代码不显示列表;
- postgresql - postgresql initdb.exe 选项标志在命令行中不起作用
- python - 抓取包含“#”的链接时出现问题
- json - 将 json_value 传递给存储过程
- c++ - 如何将具有默认参数的无捕获 lambda 转换为函数指针?
- django - django 简单历史不会显示在管理员中
- react-native - 获取通知权限的状态并通过应用程序的设置屏幕以编程方式打开通知
- sql - 使用 INTO 关键字在 SQL 中进行完全外连接
- java - SonarQube:(改为获取特定异常子类型的列表)
- json - 如何将 sql-text 转换为 jsonb-string?