如果我有以下pandas
DataFrame
:
>>> df
x y z
x 1 3 0
y 0 5 0
z 0 3 4
我想迭代列名和行索引的成对组合来执行某些操作。例如,对于x
和y
对,请将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]
答案 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
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))
通过这种方式,您可以动态遍历所有列和配对行,而无需知道有多少列。