【问题标题】:getting the column of a row in a pandas apply function在熊猫应用函数中获取一行的列
【发布时间】:2021-07-29 09:46:11
【问题描述】:

问题

嗨,窥视,这个问题与question密切相关。现在我想获得每个特定系列的index,而不是获得系列的name。我试过使用x.index,但它返回一个索引列表,而不是那个特定单元格的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,它会返回索引值列表。

正如您在示例中看到的,我只想让每个单元格的值为(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() 做到这一点?谢谢!

【问题讨论】:

  • 我对你想要的输出有点困惑。为什么每个元组的第一个元素是a?每个元组的第一个元素不应该与同一行中的索引匹配吗?
  • 啊,是的,你是对的@Derek,已在修订中修复

标签: python pandas dataframe series


【解决方案1】:

可以直接修改row系列,返回修改后的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

【讨论】:

  • 感谢您的回答。我很好奇,因为每列/行都有一个循环,这将如何影响算法的时间/空间复杂度?我会问这个,因为我要处理的数据不是太小而且相对较大,性能会是一个小问题。
  • @TotoLele 假设你的熊猫有m 行和n 列。时间复杂度为O(m*n)
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 2020-01-15
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多