Pandas:如何迭代两个格式完全相同的DataFrame?

13 投票
4 回答
26916 浏览
提问于 2025-04-18 13:02

我的最终目标是制作一个列表,这个列表包含对应数据框位置的配对,像下面这样:

 [df_one_first_element, df_two_first_element, column_first, index_first]

 :[0.619159, 0.510162, 20140109,0.50], [0.264191,0.269053,20140213,0.50]...

所以我现在想要遍历两个数据框,但遇到了困难。

我该如何遍历两个格式完全相同但数据不同的数据框呢?

举个例子,我有两个数据框;df_one 和 df_two,它们看起来像下面这样:

df_one = 

      20140109  20140213  20140313  20140410  20140508  20140612  20140710  \
0.50  0.619159  0.264191  0.438849  0.465287  0.445819  0.412582  0.397366   
0.55  0.601379  0.303953  0.457524  0.432335  0.415333  0.382093  0.382361  

df_two = 

      20140109  20140213  20140313  20140410  20140508  20140612  20140710  \
0.50  0.510162  0.269053  0.308494  0.300554  0.294360  0.286980  0.280494   
0.55  0.489953  0.258690  0.290044  0.283933  0.278180  0.271426  0.266580    

我想通过遍历整个数据框的值来访问数据框的相同位置。

首先,我尝试了 iterrows() 方法。

i = 0
for index, row in df_one.iterrows():
    j= 0
    for item in row:
        print df_two(i,j)
        j= j+1
    i = i+1

但你知道的,我们不能像这样访问:

df_two(i,j)

所以我现在有点迷茫。或者我们能通过索引名和列名来访问数据吗?

4 个回答

0

我通过使用 get_value 方法解决了这个问题。

http://pandas.pydata.org/pandas-docs/version/0.8.1/indexing.html

这是我的代码,运行起来看起来没问题。

df_columns = df_one.columns.values
for index, row in df_one.iterrows():
    j= 0
    for item in row:
        print df_two.get_value(index, df_columns[j])
        j= j+1
6

你可以使用 itertools.izip

for ( idxRow, s1 ), ( _, s2 ) in itertools.izip( df0.iterrows(), df1.iterrows() ) :
    for ( idxCol, v1 ), ( _, v2 ) in itertools.izip( s1.iteritems(), s2.iteritems() ) :
        print ( v1, v2, idxCol, idxRow )

输入:

X   Y   Z
a    1.171124    0.853229    1.416635
b    0.971665   -1.727410   -0.055180

输出:

(1.1711241491561419, 1.3715317727366974, 'X', 'a')
(0.85322862359611618, 0.72799908412372294, 'Y', 'a')
(1.4166350896829785, 2.0068549773211006, 'Z', 'a')
(0.9716653056530119, 0.94413346620976102, 'X', 'b')
(-1.727409829928936, 2.9839447205351157, 'Y', 'b')
(-0.055180403519242693, 0.0030448769325464513, 'Z', 'b')
7

这是对@usual me在Python 3中回答的一个更新。现在,标准库里的zip函数可以帮我们处理这个问题:

for (idxRow, s1), (_, s2) in zip(df0.iterrows(), df1.iterrows()):
    for (idxCol, v1), (_, v2) in zip(s1.iteritems(), s2.iteritems()):
        print (v1, v2, idxCol, idxRow)
4

下面的代码可以帮助你在两个数据框中找到相同位置的值。

python 2.x版本

for i in range(0, len(df_one.index)):
    for j in range(0, len(df_one.columns)):
        print df_one.values[i,j],df_two.values[i,j],i,j

python 3.x版本

for i in range(0, len(df_one.index)):
    for j in range(0, len(df_one.columns)):
        print(df_one.values[i,j],df_two.values[i,j],i,j)

撰写回答