迭代pandas

时间:2017-07-31 13:32:25

标签: python pandas

如果我有以下pandas DataFrame

>>> df

  x y z

x 1 3 0

y 0 5 0

z 0 3 4

我想迭代列名和行索引的成对组合来执行某些操作。例如,对于xy对,请将3替换为'xy'。所需的输出如下:

>>> df

   x  y z

x xx xy xz

y xy yy yz

z xz yz zz

我尝试过但不起作用的天真代码是:

for i, j in range(0,2):
    df.loc[df.index[i], df.columns[j]] = df.index[i] + df.columns[j]

5 个答案:

答案 0 :(得分:8)

使用Pandas DataFrame元素的简单单线程怎么样:

df.apply(lambda x: x.index+x.name)

输出:

    x   y   z
x  xx  xy  xz
y  yx  yy  yz
z  zx  zy  zz

更新:使用numpy.ufunc.outer方法。

pd.DataFrame(np.add.outer(df.index, df.columns), index=df.index, columns=df.columns)

输出:

    x   y   z
x  xx  xy  xz
y  yx  yy  yz
z  zx  zy  zz

答案 1 :(得分:2)

df.set_value()速度更快,链接到原因:Set value for particular cell in pandas DataFrame

import pandas as pd

data = [{'x': 1, 'y': 2, 'z': 3}, {'x': 4, 'y': 5, 'z': 6}, {'x': 7, 'y': 8, 'z': 9}]

df = pd.DataFrame.from_dict(data, orient='columns')

df = df.astype(str)

df

#       x   y   z
#    0  1   2   3
#    1  4   5   6
#    2  7   8   9


for idx, row in df.iterrows():
    for column in list(df.columns.values):
        val = str(idx) + str(column)
        df.set_value(idx, column, val)

df

输出:

    x   y   z
0   0x  0y  0z
1   1x  1y  1z
2   2x  2y  2z

注意:如果列名不是唯一https://github.com/cm3/lafayettedb_thumbnail_getter/issues/3,则set_value不会起作用。您必须单独修复non_unique列名称问题。

如果您不关心列名称,可以使用列#

进行预填充
df.columns = [str(idx) + '_' + name for idx, name in enumerate(df.columns)]

答案 2 :(得分:1)

这应该非常快:

import numpy as np

grid = np.meshgrid(df.columns.values.astype(str),
                   df.index.values.astype(str))
result = np.core.defchararray.add(*grid)

然后,您可以将result分配给同一个数据框或另一个数据框。

答案 3 :(得分:0)

这是你在找什么?

>>> df
   x  y  z
x  1  3  0
y  0  5  0
z  0  3  4

>>> for i in range(3):
...     for j in range(3):
...         df.loc[df.index[i], df.columns[j]] = df.index[i] + df.columns[j]
...
>>> df
    x   y   z
x  xx  xy  xz
y  yx  yy  yz
z  zx  zy  zz

答案 4 :(得分:0)

for i, col in enumerate(df.columns):
    print(df[i][col] + df[col][i])


df = pd.DataFrame(df[i][col] + df[col][i] for i, col in enumerate(df.columns))

通过这种方式,您可以动态遍历所有列和配对行,而无需知道有多少列。