获取所需格式的数据
Obtain data in the desired format
我对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,在给定日期 (3/1/2018) 有 3 条记录(票)。这些工单的 "Value" 列必须按升序排序。然后根据票数,最高的权重必须给最少的 "Value"
0.945=(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)/3+2+1
总体结果列是针对给定日期计算的,
1 除以该日期的票总数
日期 - 3/1/2018 => 1+1+0+1+0+1+1+0+1+1/10=0.66
我有大量数据需要进行这些计算。 Source 列值的数量也可以是巨大的。在修改后的数据框中,我希望它作为一列。
一种方法是在函数中编写逻辑并调用每条记录。
欢迎任何建议或帮助。提前致谢。
您可以使用 pivot_table
和自定义聚合函数来获取第一列。 groupby
添加 'Result' 列。
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))
输出:
Source Source1 Source2 Source3 Source4 Source5 Result
Date
3/1/2018 0.945753 0.958896 0.963069 0.96348 0.000000 0.714286
3/2/2018 0.000000 0.000000 0.000000 0.00000 0.955507 0.857143
您可能忘记了在加权平均计算中使用括号:
> 0.93=[(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)]/(3+2+1)
另外,尝试在 "Value"
上使用 pivot_table 和自定义聚合函数:
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()
上面的函数计算 pandas 系列的加权平均值:
- 首先,您对值进行排序并使用排序后的顺序重置索引。
- 然后计算加权平均值。
然后调用此聚合函数如下:
df1 = df.pivot_table(index="Date", columns="Source", aggfunc={"values" : func})
哪个 returns :
+----------+----------+----------+----------+---------+----------+
| | 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 |
+----------+----------+----------+----------+---------+----------+
然后 Overall_Result :
df2 = df.pivot_table(index="Date", values="Result", aggfunc="mean")
Returns
+----------+----------+
| | 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 |
+----------+----------------+----------+----------+----------+---------+----------+
我对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,在给定日期 (3/1/2018) 有 3 条记录(票)。这些工单的 "Value" 列必须按升序排序。然后根据票数,最高的权重必须给最少的 "Value"
0.945=(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)/3+2+1
总体结果列是针对给定日期计算的,
1 除以该日期的票总数 日期 - 3/1/2018 => 1+1+0+1+0+1+1+0+1+1/10=0.66
我有大量数据需要进行这些计算。 Source 列值的数量也可以是巨大的。在修改后的数据框中,我希望它作为一列。 一种方法是在函数中编写逻辑并调用每条记录。 欢迎任何建议或帮助。提前致谢。
您可以使用 pivot_table
和自定义聚合函数来获取第一列。 groupby
添加 'Result' 列。
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))
输出:
Source Source1 Source2 Source3 Source4 Source5 Result
Date
3/1/2018 0.945753 0.958896 0.963069 0.96348 0.000000 0.714286
3/2/2018 0.000000 0.000000 0.000000 0.00000 0.955507 0.857143
您可能忘记了在加权平均计算中使用括号:
> 0.93=[(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)]/(3+2+1)
另外,尝试在 "Value"
上使用 pivot_table 和自定义聚合函数:
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()
上面的函数计算 pandas 系列的加权平均值:
- 首先,您对值进行排序并使用排序后的顺序重置索引。
- 然后计算加权平均值。
然后调用此聚合函数如下:
df1 = df.pivot_table(index="Date", columns="Source", aggfunc={"values" : func})
哪个 returns :
+----------+----------+----------+----------+---------+----------+
| | 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 |
+----------+----------+----------+----------+---------+----------+
然后 Overall_Result :
df2 = df.pivot_table(index="Date", values="Result", aggfunc="mean")
Returns
+----------+----------+
| | 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 |
+----------+----------------+----------+----------+----------+---------+----------+