对python中数据框的每个元素应用相同的计算

Posted

技术标签:

【中文标题】对python中数据框的每个元素应用相同的计算【英文标题】:Applying same calcuation to each element of dataframe in python 【发布时间】:2016-10-05 17:16:53 【问题描述】:

我有一个这样的数据框。

          user  tag1  tag2  tag3
0  Roshan ghai   0.0   1.0   1.0
1    mank nion   1.0   1.0   2.0
2   pop rajuel   2.0   0.0   1.0
3   random guy   2.0   1.0   1.0

我必须对每一行应用一个计算。对于每个元素 x

x =(( specific tag's count for that user ##that element itself##))/ max no. of count of that tag ##max value of that column##)) * (ln(no. of total user ##lenth of df##)/(no. of of user having that tag ##no. of user having non 0 count for that particular tag or column ##))

我用## 来描述那个特定的值。我必须为数据框的每个元素都这样做,因为我有一个很大的数字,所以最有效的方法是什么。的元素。我正在使用python2.7。 输出:

          user  tag1  tag2  tag3
0  Roshan ghai     0  .287     0
1    mank nion  .143  .287     0
2   pop rajuel  .287     0     0
3   random guy  .287  .287     0

我刚刚使用了我为 mank nion 和 tag1 编写的公式 x =((1.0)/2.0)*(ln(4/3) = .143 .

【问题讨论】:

您能否添加所需的输出以及如何计算此输出中的第一个值? @jezrael 我已经添加了输出,该用户的计数是我在数据框中为该用户和标签所拥有的内容,例如 mank nion 和 tag1 它是 1.0。还有其他疑问吗?请帮忙 @jezrael 请帮忙。 请检查解决方案。 【参考方案1】:

你可以试试这个:

import io
temp = u"""          user  tag1  tag2  tag3
0  Roshan-ghai   0.0   1.0   1.0
1    mank-nion   1.0   1.0   2.0
2   pop-rajuel   2.0   0.0   1.0
3   random-guy   2.0   1.0   1.0"""
df = pd.read_csv(io.StringIO(temp), delim_whitespace=True)

maxtag1 = df.tag1.max()
maxtag2 = df.tag2.max()
maxtag3 = df.tag3.max()
number_users = len(df)
number_users_tag1 = len(df[df['tag1']!=0])
number_users_tag2 = len(df[df['tag2']!=0])
number_users_tag3 = len(df[df['tag3']!=0])
liste_values = [maxtag1,maxtag2,maxtag3,number_users,number_users_tag1,number_users_tag2,number_users_tag3]

然后您创建一个函数,该函数将您的行和这些值作为输入,并输出所需的三个值。并使用apply

output = df.apply(lambda x: yourfunction(x, list_values))

【讨论】:

我猜对 200 个用户使用这种方法不会那么好。有一些功能可以短而快地做到这一点,我希望如此。 我对有几十万行的数据帧执行此操作,并且只需不到一分钟。所以它非常有效,但确实远非最佳。【参考方案2】:

您可以先通过ix 选择所有没有第一列的值。然后使用非0值的maxsumnumpy.log

import pandas as pd
import numpy as np

print (df.ix[:, 'tag1':].max())
tag1    2.0
tag2    1.0
tag3    2.0
dtype: float64

print ((df.ix[:, 'tag1':] != 0).sum())
tag1    3
tag2    3
tag3    4
dtype: int64

df.ix[:, 'tag1':] = (df.ix[:, 'tag1':] / df.ix[:, 'tag1':].max() * 
                    (np.log(len(df) / (df.ix[:, 'tag1':] != 0).sum())))

print (df)
          user      tag1      tag2  tag3
0  Roshan-ghai  0.000000  0.287682   0.0
1    mank-nion  0.143841  0.287682   0.0
2   pop-rajuel  0.287682  0.000000   0.0
3   random-guy  0.287682  0.287682   0.0

iloc 的另一个解决方案:

df1 = df.iloc[:, 1:]
df.iloc[:, 1:] = (df1 / df1.max() * (np.log(len(df) / (df1 != 0).sum())))
print (df)
          user      tag1      tag2  tag3
0  Roshan-ghai  0.000000  0.287682   0.0
1    mank-nion  0.143841  0.287682   0.0
2   pop-rajuel  0.287682  0.000000   0.0
3   random-guy  0.287682  0.287682   0.0

【讨论】:

以上是关于对python中数据框的每个元素应用相同的计算的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas分组聚合

python列表的遍历与循环

不用循环,python numpy 数组如何对每个元素进行操作?

对 Pandas 数据框逐元素应用条件

熊猫如何在数据框的相应列检查行的每个元素的百分位数

matlab中怎样计算一个矩阵中每个数的平方?