首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:如何在不同的熊猫数据帧列之间进行平均处理?

Python:如何在不同的熊猫数据帧列之间进行平均处理?
EN

Stack Overflow用户
提问于 2016-03-28 22:12:41
回答 2查看 74关注 0票数 1

我有以下数据集:

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({'ID1': [0, 1, 0, 2, 2, 4],
 'ID2': [1, 0, 3, 4, 4, 2],
 'Title': ['a', 'b', 'c', 'd', 'e', 'f'],
 'Weight': [3, 5, 1, 1, 5, 1]})

df

ID1   ID2   Title  Weight
0      1      a     3 
1      0      b     5 
0      3      c     1
2      4      d     1
2      4      e     5
4      2      f     1

我想检查多少次到ID协作和计数总频率和加权平均数。加权是协作的sum,而不是Weightsum。其结果应是:

代码语言:javascript
复制
df1

ID1    ID2    Total   Weighted Av.
 1      0       2        0.25
 0      3       1          1
 2      4       3         0.5

我以错误的方式计算ID1ID2之间的协作。

代码语言:javascript
复制
df.groupby(['ID1','ID2']).size().reset_index()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 22:57:41

您可以首先按照ID1ID2对列进行numpy.ndarray.sort排序,然后使用apply自定义函数fgroupby进行排序。

代码语言:javascript
复制
print df
   ID1  ID2 Title  Weight
0    0    1     a       3
1    1    0     b       5
2    0    3     c       1
3    2    4     d       1
4    2    4     e       5
5    4    2     f       1

id1id2 = df[['ID1','ID2']].values
id1id2.sort(axis=1)
print id1id2
[[0 1]
 [0 1]
 [0 3]
 [2 4]
 [2 4]
 [2 4]]

df[['ID1','ID2']] = id1id2
print df
   ID1  ID2 Title  Weight
0    0    1     a       3
1    0    1     b       5
2    0    3     c       1
3    2    4     d       1
4    2    4     e       5
5    2    4     f       1
代码语言:javascript
复制
def f(x):
    #print len(x)
    #print x['Weight'].sum()
    return pd.Series({'Total':len(x), 'Weighted Av.': len(x) / float(x['Weight'].sum()) })

print df.groupby(['ID1','ID2']).apply(f).reset_index()
   ID1  ID2  Total  Weighted Av.
0    0    1    2.0      0.250000
1    0    3    1.0      1.000000
2    2    4    3.0      0.428571
票数 0
EN

Stack Overflow用户

发布于 2016-03-28 22:34:21

假设您定义了

代码语言:javascript
复制
pairs = df.apply(lambda r: (min(r.ID1, r.ID2), max(r.ID1, r.ID2)), axis=1)

然后,这些就是你们DataFrame的标准化对(低第一,高第二)。现在,您只需根据这些数据进行分组,就可以找到加权平均值:

代码语言:javascript
复制
>>> df.groupby(pairs).apply(lambda g: len(g) / float(g.Weight.sum()))
(0, 1)    0.250000
(0, 3)    1.000000
(2, 4)    0.428571
dtype: float64

要获得准确的所需的DataFrame,需要对列进行一些修改,但基本上是上面的代码:

代码语言:javascript
复制
pairs = df.apply(lambda r: (min(r.ID1, r.ID2), max(r.ID1, r.ID2)), axis=1)
weighted = pd.merge(
    df.groupby(pairs).apply(lambda g: len(g) / float(g.Weight.sum())).reset_index(),
    df.groupby(pairs).size().reset_index(),
    left_index=True,
    right_index=True)
weighted['ID1'] = weighted['index_x'].apply(lambda p: p[0])
weighted['ID2'] = weighted['index_x'].apply(lambda p: p[1])
weighted['Total'] = weighted['0_x']
weighted['Weighted Ave'] = weighted['0_y']
weighted = weighted[['ID1', 'ID2', 'Total', 'Weighted Ave']]
>>> weighted
    ID1     ID2     Total   Weighted Ave
0   0   1   0.250000    2
1   0   3   1.000000    1
2   2   4   0.428571    3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36272123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档