Python Pandas迭代行并访问列名

时间:2017-04-25 19:59:03

标签: python pandas dataframe series

我正在尝试迭代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

我使用this approach进行迭代,但它只给了我解决方案的一部分 - 在每次迭代中选择一行后,如何按列名访问行元素?

以下是我要做的事情:

for row in df.iterrows():
    print row.loc[0,'A']
    print row.A
    print row.index()

我的理解是该行是一只熊猫series。但是我无法索引该系列。

是否可以在同时迭代行时使用列名?

5 个答案:

答案 0 :(得分:25)

我也喜欢itertuples()

for row in df.itertuples():
    print(row.A)
    print(row.Index)

因为row是一个命名元组,如果你想访问每一行的值,那么这应该是 MUCH 更快

速度跑:

df = pd.DataFrame([x for x in range(1000*1000)], columns=['A'])
st=time.time()
for index, row in df.iterrows():
    row.A
print(time.time()-st)
45.05799984931946

st=time.time()
for row in df.itertuples():
    row.A
print(time.time() - st)
0.48400020599365234

答案 1 :(得分:18)

iterrows()中的项目不是系列,而是(索引,系列)的元组,因此您可以像这样解压缩for循环中的元组:

for (idx, row) in df.iterrows():
    print(row.loc['A'])
    print(row.A)
    print(row.index)

#0.890618586836
#0.890618586836
#Index(['A', 'B', 'C', 'D'], dtype='object')

答案 2 :(得分:0)

for i in range(1,len(na_rm.columns)):
           print ("column name:", na_rm.columns[i])

输出:

column name: seretide_price
column name: symbicort_mkt_shr
column name: symbicort_price

答案 3 :(得分:0)

我试图弄清楚如何通过熊猫数据框有效地进行迭代。有不同的方法,通常的iterrows()远非最佳。 itertuples()可以快100倍。

df = pd.DataFrame(np.random.randint(0, 100, size=(1000000, 4)), columns=list('ABCD'))
print(df)

1)iterrows()很方便,但是该死的很慢

start_time = time.clock()
result = 0
for _, row in df.iterrows():
    result += max(row['B'], row['C'])

total_elapsed_time = round(time.clock() - start_time, 2)
print("1. Iterrows done in {} seconds, result = {}".format(total_elapsed_time, result))

2)默认的itertuples()已经快了

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row.B, row.C)

total_elapsed_time = round(time.clock() - start_time, 2)
print("2. Named Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))

3)使用另一种访问方法的默认itertuples()

start_time = time.clock()
result = 0
for row in df.itertuples():
    result += max(getattr(row, "B"), getattr(row, "C"))

total_elapsed_time = round(time.clock() - start_time, 2)
print("3. Named Itertuples using getattr done in {} seconds, result = {}".format(total_elapsed_time, result))

4)使用name = None的默认itertuples()更快

start_time = time.clock()
result = 0
for(_, col1, col2, col3, col4) in df.itertuples(name=None):
    result += max(col2, col3)

total_elapsed_time = round(time.clock() - start_time, 2)
print("4. Itertuples done in {} seconds, result = {}".format(total_elapsed_time, result))

5)命名为itertuples()的列名,例如My Col-Name is very Strange

start_time = time.clock()
result = 0
for row in df.itertuples(index=False):
    result += max(row[df.columns.get_loc('B')], row[df.columns.get_loc('C')])

total_elapsed_time = round(time.clock() - start_time, 2)
print("5. Polyvalent Itertuples working even with special characters in the column name done in {} seconds, result = {}".format(total_elapsed_time, result))

输出:

         A   B   C   D
0       41  63  42  23
1       54   9  24  65
2       15  34  10   9
3       39  94  82  97
4        4  88  79  54
...     ..  ..  ..  ..
999995  48  27   4  25
999996  16  51  34  28
999997   1  39  61  14
999998  66  51  27  70
999999  51  53  47  99

[1000000 rows x 4 columns]

1. Iterrows done in 104.96 seconds, result = 66151519
2. Named Itertuples done in 1.26 seconds, result = 66151519
3. Named Itertuples using getattr done in 1.56 seconds, result = 66151519
4. Itertuples done in 0.94 seconds, result = 66151519
5. Polyvalent Itertuples working even with special characters in the column name done in 2.94 seconds, result = 66151519

This article is a very interesting comparison between iterrows and itertuples

总结:

  • 列数固定(且少于255个列)时,请使用df.itertuples(name=None)
  • 使用df.itertuples()否则,除非您的列中有特殊字符(''或'-',)
  • 通过最后一个示例,即使您的数据框具有奇怪的列,也可以使用itertuples()
  • 仅在无法解决以前的解决方案时使用iterrows()

答案 4 :(得分:0)

这并不像我希望的那么简单。您需要使用 enumerate 来跟踪您有多少列。然后使用该计数器查找列的名称。接受的答案没有向您展示如何动态访问列名。

for row in df.itertuples(index=False, name=None):
    for k,v in enumerate(row):
        print("column: {0}".format(df.columns.values[k]))
        print("value: {0}".format(v)