繁体   English   中英

如何将函数应用于数据帧的每一行并返回结果

[英]How to apply a function to each row of a dataframe and get the results back

这是我的数据框

            3        4        5        6       97       98       99      100
0         1.0      2.0      3.0      4.0     95.0     96.0     97.0     98.0
1     50699.0  16302.0  50700.0  16294.0  50735.0  16334.0  50737.0  16335.0
2     57530.0  33436.0  57531.0  33438.0      NaN      NaN      NaN      NaN
3     24014.0  24015.0  34630.0  24016.0      NaN      NaN      NaN      NaN
4     44933.0   2611.0  44936.0   2612.0  44982.0   2631.0  44972.0   2633.0
1792  46712.0  35340.0  46713.0  35341.0  46759.0  35387.0  46760.0  35388.0
1793  61283.0  40276.0  61284.0  40277.0  61330.0  40323.0  61331.0  40324.0
1794      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0
1795      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0
1796  27156.0  48331.0  27157.0  48332.0      NaN      NaN      NaN      NaN


--> 如何应用以下函数并在一次运行中获取每一行的答案... values 是每行的值数组,N 是 100

def entropy_s(values, N):
    a= scipy.stats.entropy(values,base=2)
    a = round(a,2)
    global CONSTANT_COUNT,RANDOM_COUNT,LOCAL_COUNT,GLOBAL_COUNT,ODD_COUNT
    if(math.isnan(a) == True):
        a = 0.0
    if(a==0.0):
        CONSTANT_COUNT += 1
    elif(a<round(math.log2(N),2)):
        LOCAL_COUNT +=1
        RANDOM_COUNT +=1
    elif(a==round(math.log2(N),2)):
            RANDOM_COUNT +=1
            GLOBAL_COUNT += 1
            LOCAL_COUNT += 1
    else:
        ODD_COUNT +=1

我假设这些值应该是行? 在这种情况下,我建议如下:行将被提供给函数,您可以使用 row.column_name 获取每行中的列。

def func(N=100):
  def entropy_s(values):
    a= scipy.stats.entropy(values,base=2)
    a = round(a,2)
    global CONSTANT_COUNT,RANDOM_COUNT,LOCAL_COUNT,GLOBAL_COUNT,ODD_COUNT
    if(math.isnan(a) == True):
        a = 0.0
    if(a==0.0):
        CONSTANT_COUNT += 1
    elif(a<round(math.log2(N),2)):
        LOCAL_COUNT +=1
        RANDOM_COUNT +=1
    elif(a==round(math.log2(N),2)):
            RANDOM_COUNT +=1
            GLOBAL_COUNT += 1
            LOCAL_COUNT += 1
    else:
        ODD_COUNT +=1
  return entropy_s


df.apply(func(100), axis=1)

如果您想将行作为列表,您可以这样做:

df.apply(lambda x: func(100)([k for k in x]), axis=1)
import functools
series = df.apply(functool.partial(entropy_s, N=100), axis=1)
# or 
series = df.apply(lambda x: entropy_s(x, N=100), axis=1)

axis=1会将您的df的行推送到apply的第一个参数。

你会得到一个pd.SeriesNone ,因为你的函数不返回任何东西。

我强烈建议避免在你的函数中使用全局变量。

编辑:如果你想要有意义的帮助,你需要提出有意义的问题。 你得到了哪些错误?

这是一个快速而肮脏的示例,演示了我的建议。 如果您有错误,您的函数可能有错误(例如,它不返回任何内容),或者它不知道如何处理 NaN。

In [6]: df = pd.DataFrame({1: [1, 2, 3], 2: [3, 4, 5], 3: [6, 7, 8]})

In [7]: df
Out[7]:
   1  2  3
0  1  3  6
1  2  4  7
2  3  5  8

In [8]: df.apply(lambda x: np.sum(x), axis=1)
Out[8]:
0    10
1    13
2    16
dtype: int64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM