Python 获取所需格式的数据

Python 获取所需格式的数据,python,python-3.x,pandas,dataframe,weighted-average,Python,Python 3.x,Pandas,Dataframe,Weighted Average,我对Python有点陌生,我有以下要求 Value Date Ticket Source Result 0.939531371 3/1/2018 T1 Source1 1 0.951619897 3/1/2018 T2 Source1 1 0.952681914 3/1/2018 T3 Source1 0 0.957009407 3/1/2018 T4 Source2 1 0.962669466 3/1/2018 T5 Sou

我对Python有点陌生,我有以下要求

Value         Date  Ticket  Source  Result
0.939531371 3/1/2018    T1  Source1  1
0.951619897 3/1/2018    T2  Source1  1
0.952681914 3/1/2018    T3  Source1  0
0.957009407 3/1/2018    T4  Source2  1
0.962669466 3/1/2018    T5  Source2  0 
0.963068552 3/1/2018    T6  Source3  1
0.963480195 3/1/2018    T7  Source4  1
0.951296258 3/2/2018    T11 Source5  1
0.962434762 3/2/2018    T12 Source5  1
0.950224149 3/2/2018    T13 Source5  1
0.961191873 3/2/2018    T14 Source5  1
0.952584896 3/2/2018    T15 Source5  0
0.962093595 3/2/2018    T16 Source5  1
0.975999737 3/2/2018    T17 Source5  1
从这个数据帧中,我想生成下面的数据帧-

Date      Source1 Source2 Source3 Source4 Source5 Overall_Result
3/1/2018   0.93     0.95   0.96     0.96      0        0.7
3/2/2018     0        0      0        0      0.95      0.85
这里涉及的计算是加权平均数-

资料来源1- 对于给定的日期和给定的来源,我们需要获得门票的总数。对于Source1,在给定日期(2018年3月1日)有3条记录(票据)。这些票据的“值”列必须按升序排序。然后根据票数,必须将最高权重赋予最小“值”

总结果列按给定日期计算

多少是1除以当天的总票数 日期-2018年3月1日=>1+1+0+1+0+1+1+0+1+1+1/10=0.66

我有大量的数据需要进行计算。源列值的数量也可能是巨大的。在修改后的dataframe中,我希望它作为列。 一种方法是在函数中写入逻辑并调用每个记录。
欢迎任何建议或帮助。提前感谢。

您可以使用带有自定义聚合函数的
pivot\u table
来获取第一列。和
groupby
添加“结果”列

import numpy as np
import pandas as pd

df2 = df.sort_values('Value').pivot_table(
        index='Date', 
        columns='Source',
        values='Value',
        aggfunc = lambda x: (x*np.arange(len(x), 0, -1)).sum()/np.arange(len(x), 0, -1).cumsum()[-1]).fillna(0)

df2['Result'] = df.groupby('Date').Result.apply(lambda x: x.sum()/np.size(x))
输出:
您可能忘记在加权平均值计算中使用括号:

> 0.93=[(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)]/(3+2+1)
另外,尝试使用带有自定义聚合功能的
上的pivot\u表:

def func(series) : 
  s = series.sort_values().reset_index(drop=True).reset_index()
  return s.apply(lambda x : (len(s) - x["index"]) * x["Value"] /sum(np.arange(1, len(s) + 1)), axis=1).sum()
上述函数计算熊猫系列的加权平均值:

  • 首先对值进行排序,并按排序顺序重置索引
  • 然后计算加权平均数
然后按如下方式调用此聚合函数:

df1 = df.pivot_table(index="Date", columns="Source", aggfunc={"values" : func})
返回:

+----------+----------+----------+----------+---------+----------+
|          |  Value   |          |          |         |          |
+----------+----------+----------+----------+---------+----------+
| Source   | Source1  | Source2  | Source3  | Source4 | Source5  |
| Date     |          |          |          |         |          |
+----------+----------+----------+----------+---------+----------+
| 3/1/2018 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
| 3/2/2018 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
+----------+----------+----------+----------+---------+----------+
然后,对于总体结果:

df2 = df.pivot_table(index="Date",  values="Result", aggfunc="mean")
返回

+----------+----------+
|          |  Result  |
+----------+----------+
| Date     |          |
| 3/1/2018 | 0.714286 |
| 3/2/2018 | 0.857143 |
+----------+----------+
最后,您可以连接两个数据帧以获得所需的数据帧:

df1.columns = df1.columns.droplevel()
df2.columns = ["Overall_Result" ]
dfResult = pd.concat([df1, df2], axis=1)
i、 e


你能检查一下你例子中的数学吗。我得到了
0.9457=((0.939531370722655*3)+(0.951619897215127*2)+(1*0.952681914218488))/(3+2+1)
感谢@ALollz的更正。。。更正了问题!!。。
+----------+----------+
|          |  Result  |
+----------+----------+
| Date     |          |
| 3/1/2018 | 0.714286 |
| 3/2/2018 | 0.857143 |
+----------+----------+
df1.columns = df1.columns.droplevel()
df2.columns = ["Overall_Result" ]
dfResult = pd.concat([df1, df2], axis=1)
+----------+----------------+----------+----------+----------+---------+----------+
|          | Overall_Result | Source1  | Source2  | Source3  | Source4 | Source5  |
+----------+----------------+----------+----------+----------+---------+----------+
| Date     |                |          |          |          |         |          |
| 3/1/2018 |       0.714286 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
| 3/2/2018 |       0.857143 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
+----------+----------------+----------+----------+----------+---------+----------+