在 pandas 应用函数中获取一行的列
getting the column of a row in a pandas apply function
问题
大家好,这个问题与question密切相关。而不是获得系列的 name
,现在我想获得每个特定系列的 index
。我试过使用 x.index
但它 returns 是一个索引列表而不是那个特定单元格的 index
。
In [14]: df = pd.DataFrame({
...: 'X': [1,2,3,4,5],
...: 'Y': [3,4,5,6,7],
...: 'Z': [5,6,7,8,9]}, index=['a', 'b', 'c', 'd', 'e'])
In [15]: df
Out[15]:
X Y Z
a 1 3 5
b 2 4 6
c 3 5 7
d 4 6 8
e 5 7 9
In [15]: df.apply(lambda x: (x.name, x.index), axis=1)
Out[15]:
a (a, [X, Y, Z])
b (b, [X, Y, Z])
c (c, [X, Y, Z])
d (d, [X, Y, Z])
e (e, [X, Y, Z])
dtype: object
期望的输出
我想实现如下格式。但是,我不确定如何访问该特定行的 index
。如果我使用 x.index
,它 returns 索引值列表。
如您在示例中所见,我只想让每个单元格的值为 (index, column), value
X Y Z
a (a, X), 1 (a, Y), 3 (a, Z), 5
b (b, X), 2 (b, Y), 4 (b, Z), 6
c (c, X), 3 (c, Y), 5 (c, Z), 7
d (d, X), 4 (d, Y), 6 (d, Z), 8
e (e, X), 5 (e, Y), 7 (e, Z), 9
试炼
我已经尝试了以下方法,但由于 index
是硬编码的,所以它不起作用。我也检查了 index docs 但找不到适合此需求的任何属性。
In [35]: df.apply(lambda x: (x.name, x.index[0]), axis=1)
Out[35]:
a (a, X)
b (b, X)
c (c, X)
d (d, X)
e (e, X)
dtype: object
In [36]: df.apply(lambda x: (x.name, x.index[1]), axis=1)
Out[36]:
a (a, Y)
b (b, Y)
c (c, Y)
d (d, Y)
e (e, Y)
dtype: object
In [37]:
我认为可以遍历每一列并重新分配其中的值。但是,有没有办法用 apply()
做到这一点?谢谢!
您可以直接修改row
系列和return修改后的row
系列。
def convert(row):
for col in row.index:
row[col] = f'({row.name}, {col}), {row[col]}'
return row
df = df.apply(convert, axis=1)
print(df)
X Y Z
a (a, X), 1 (a, Y), 3 (a, Z), 5
b (b, X), 2 (b, Y), 4 (b, Z), 6
c (c, X), 3 (c, Y), 5 (c, Z), 7
d (d, X), 4 (d, Y), 6 (d, Z), 8
e (e, X), 5 (e, Y), 7 (e, Z), 9
问题
大家好,这个问题与question密切相关。而不是获得系列的 name
,现在我想获得每个特定系列的 index
。我试过使用 x.index
但它 returns 是一个索引列表而不是那个特定单元格的 index
。
In [14]: df = pd.DataFrame({
...: 'X': [1,2,3,4,5],
...: 'Y': [3,4,5,6,7],
...: 'Z': [5,6,7,8,9]}, index=['a', 'b', 'c', 'd', 'e'])
In [15]: df
Out[15]:
X Y Z
a 1 3 5
b 2 4 6
c 3 5 7
d 4 6 8
e 5 7 9
In [15]: df.apply(lambda x: (x.name, x.index), axis=1)
Out[15]:
a (a, [X, Y, Z])
b (b, [X, Y, Z])
c (c, [X, Y, Z])
d (d, [X, Y, Z])
e (e, [X, Y, Z])
dtype: object
期望的输出
我想实现如下格式。但是,我不确定如何访问该特定行的 index
。如果我使用 x.index
,它 returns 索引值列表。
如您在示例中所见,我只想让每个单元格的值为 (index, column), value
X Y Z
a (a, X), 1 (a, Y), 3 (a, Z), 5
b (b, X), 2 (b, Y), 4 (b, Z), 6
c (c, X), 3 (c, Y), 5 (c, Z), 7
d (d, X), 4 (d, Y), 6 (d, Z), 8
e (e, X), 5 (e, Y), 7 (e, Z), 9
试炼
我已经尝试了以下方法,但由于 index
是硬编码的,所以它不起作用。我也检查了 index docs 但找不到适合此需求的任何属性。
In [35]: df.apply(lambda x: (x.name, x.index[0]), axis=1)
Out[35]:
a (a, X)
b (b, X)
c (c, X)
d (d, X)
e (e, X)
dtype: object
In [36]: df.apply(lambda x: (x.name, x.index[1]), axis=1)
Out[36]:
a (a, Y)
b (b, Y)
c (c, Y)
d (d, Y)
e (e, Y)
dtype: object
In [37]:
我认为可以遍历每一列并重新分配其中的值。但是,有没有办法用 apply()
做到这一点?谢谢!
您可以直接修改row
系列和return修改后的row
系列。
def convert(row):
for col in row.index:
row[col] = f'({row.name}, {col}), {row[col]}'
return row
df = df.apply(convert, axis=1)
print(df)
X Y Z
a (a, X), 1 (a, Y), 3 (a, Z), 5
b (b, X), 2 (b, Y), 4 (b, Z), 6
c (c, X), 3 (c, Y), 5 (c, Z), 7
d (d, X), 4 (d, Y), 6 (d, Z), 8
e (e, X), 5 (e, Y), 7 (e, Z), 9