python - 从 DataFrame.apply 中检索未知的列名

标签 python python-3.x pandas dataframe

如何在事先不知道的情况下从对 DataFrame apply 的调用中检索列名?

我想要做的是应用从列名到函数到任意数据帧的映射。这些函数可能会返回多列。我想最终得到一个包含原始列和新列的 DataFrame,我在构建时不知道它们的数量和名称。

这里的其他解决方案是基于系列的。如果可能的话,我想一次完成整个框架。

我在这里错过了什么?除非我知道它们的名字,否则从 apply 返回的列是否会在解构过程中丢失?看起来 assign 可能很有用,但可能需要大量样板文件。

import pandas as pd

def fxn(col):
    return pd.Series(col * 2, name=col.name+'2')

df = pd.DataFrame({'A': range(0, 10), 'B': range(10, 0, -1)})
print(df)

# [Edit:]
#    A   B
# 0  0  10
# 1  1   9
# 2  2   8
# 3  3   7
# 4  4   6
# 5  5   5
# 6  6   4
# 7  7   3
# 8  8   2
# 9  9   1

df = df.apply(fxn)
print(df)

# [Edit:]
# Observed: columns changed in-place.
#     A   B
# 0   0  20
# 1   2  18
# 2   4  16
# 3   6  14
# 4   8  12
# 5  10  10
# 6  12   8
# 7  14   6
# 8  16   4
# 9  18   2

df[['A2', 'B2']] = df.apply(fxn)
print(df)

# [Edit: I am doubling column values, so missing something, but the question about the column counts stands.]
# Expected: new columns added. How can I do this at runtime without knowing column names?
#     A   B  A2  B2
# 0   0  40   0  80
# 1   4  36   8  72
# 2   8  32  16  64
# 3  12  28  24  56
# 4  16  24  32  48
# 5  20  20  40  40
# 6  24  16  48  32
# 7  28  12  56  24
# 8  32   8  64  16
# 9  36   4  72   8

最佳答案

您需要concat您的函数的结果与原始df

使用pd.concat :

In [8]: x = df.apply(fxn) # Apply function on df and store result separately
In [10]: df = pd.concat([df, x], axis=1) # Concat with original df to get all columns

通过添加后缀重命名重复的列名:

In [82]: from collections import Counter

In [38]: mylist = df.columns.tolist()
In [41]: d = {a:list(range(1, b+1)) if b>1 else '' for a,b in Counter(mylist).items()}

In [62]: df.columns = [i+str(d[i].pop(0)) if len(d[i]) else i for i in mylist]

In [63]: df
Out[63]: 
   A1  B1  A2  B2
0   0  10   0  20
1   1   9   2  18
2   2   8   4  16
3   3   7   6  14
4   4   6   8  12
5   5   5  10  10
6   6   4  12   8
7   7   3  14   6
8   8   2  16   4
9   9   1  18   2

关于python - 从 DataFrame.apply 中检索未知的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65516973/

相关文章:

python - 为什么 pysqlite 不能正常工作?

python - 如何让我的 Discord 机器人每周日在 0 :00? 运行一个函数

python-3.x - torch.mm、torch.matmul 和 torch.mul 有什么区别?

python - 使用带有自定义类的图形生成器作为节点

python - line.strip() 方法说明

Python - 对继承感到困惑

Python - 通过一周中的所有天对数据框进行排序

python - Pandas : difference() methode between polygon and points

python - 使用 python pandas 如何进行一些分析以识别有效的手机号码

python - 64 位上的 Matlab 安装目录是什么,或者如何在 Python 中获取它?