【问题标题】:How to apply a function to all the columns in a data frame and take output in the form of dataframe in python如何将函数应用于数据框中的所有列并在python中以数据框的形式输出
【发布时间】:2019-09-09 12:28:25
【问题描述】:

我有两个函数可以进行一些计算并给出结果。现在,我可以将它应用在一个列中,并以数据框的形式获得结果。 我需要知道如何将函数应用于数据框中的所有列,并以数据框的形式获得结果。

假设我有一个如下的数据框,我需要在数据框中的每一列上应用该函数,并获得一个数据框,其中所有列的结果都对应。

A   B   C   D   E   F
1456    6744    9876    374 65413   1456
654 2314    674654  2156    872 6744
875 653 36541   345 4963    9876
6875    7401    3654    465 3547    374
78654   8662    35  6987    6874    65413
658 94512   687 489 8756    5854

结果

A   B   C   D   E   F
2110    9058    684530  2530    66285   8200
1529    2967    711195  2501    5835    16620
7750    8054    40195   810 8510    10250
85529   16063   3689    7452    10421   65787

【问题讨论】:

  • 你能解释一下输出吗?也贴出实现输出的功能

标签: python pandas dataframe iteration


【解决方案1】:

pd.DataFrame 对象也有自己的apply method

来自上面链接文档中给出的示例:

>>> df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])
>>> df
   A  B
0  4  9
1  4  9
2  4  9
>>> df.apply(np.sqrt)
     A    B
0  2.0  3.0
1  2.0  3.0
2  2.0  3.0

结论:您应该能够将您的函数应用于整个数据帧。

【讨论】:

  • 好吧,OP 的功能有效,apply 方法适用于任何给定的功能,所以它应该有效,你不觉得吗?我只是怀疑 OP 只是在 pd.Series 上尝试过,例如:df["A"].apply(my_func)
【解决方案2】:

这是一个简单的例子

df

    A   B   C   D
0  10  11  12  13
1  20  21  22  23
2  30  31  32  33
3  40  41  42  43

# Assume your user defined function is 
def mul(x, y):
  return x * y

这将使值相乘

假设您想将第一列“A”乘以 3

df['A'].apply(lambda x: mul(x,3))

0     30
1     60
2     90
3    120

现在,您想将 mul 函数应用于数据框的所有列并创建带有结果的新数据框

df1 = df.applymap(lambda x: mul(x, 3))

df1

     A    B    C    D
0   30   33   36   39
1   60   63   66   69
2   90   93   96   99
3  120  123  126  129

【讨论】:

    【解决方案3】:

    看起来这是您在输出中尝试执行的操作:

    df = pd.DataFrame(
        [[1456, 6744, 9876, 374, 65413, 1456],
         [654, 2314, 674654, 2156, 872, 6744],
         [875, 653, 36541, 345, 4963, 9876],
         [6875, 7401, 3654, 465, 3547, 374],
         [78654, 8662, 35, 6987, 6874, 65413],
         [658, 94512, 687, 489, 8756, 5854]],
        columns=list('ABCDEF'))
    
    def fn(col):
        return col[:-2].values + col[1:-1].values
    

    应用前面答案中提到的功能:

    >>> df.apply(fn)
            A   B   C   D   E   F
    0   2110    9058    684530  2530    66285   8200
    1   1529    2967    711195  2501    5835    16620
    2   7750    8054    40195   810 8510    10250
    3   85529   16063   3689    7452    10421   65787
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多