Python 如何重塑Pandas数据框以显示列中的某些值每天是否存在?
我正在编写一个脚本来查询数据库并返回一个数据帧df,如下所示:Python 如何重塑Pandas数据框以显示列中的某些值每天是否存在?,python,pandas,numpy,qa,Python,Pandas,Numpy,Qa,我正在编写一个脚本来查询数据库并返回一个数据帧df,如下所示: cost data_source process_date revenue 0 0.796895 A 2016-10-01 0.133634 1 0.222457 B 2016-10-02 0.111921 2 0.980005 C 2016-10-03 0.353150 3 0.332533 D 2016
cost data_source process_date revenue
0 0.796895 A 2016-10-01 0.133634
1 0.222457 B 2016-10-02 0.111921
2 0.980005 C 2016-10-03 0.353150
3 0.332533 D 2016-10-04 0.686957
4 0.554089 E 2016-10-05 0.798600
目的是检查上述数据帧df中是否缺少来自以下系列所有数据源的数据源
:
0 A
1 B
2 C
3 D
4 E
5 F
6 G
dtype: object
脚本应返回一个新的数据框,该数据框按天(索引)显示查询的df中缺少的所有数据源
(列)。就我想要的格式而言,我得到的最接近的格式是使用数据透视表:
source_by_date = df.pivot_table(values = "cost", index = "process_date",
columns = "data_source",
aggfunc = np.mean)
它返回一个新的df,看起来像我想要的,但值错误:
data_source A B C D E
process_date
2016-10-01 0.796895 NaN NaN NaN NaN
2016-10-02 NaN 0.222457 NaN NaN NaN
2016-10-03 NaN NaN 0.980005 NaN NaN
2016-10-04 NaN NaN NaN 0.332533 NaN
2016-10-05 NaN NaN NaN NaN 0.554089
我不希望返回每个数据源的平均成本,而是希望如果数据源丢失,则返回True;如果不丢失,则返回False(反之亦然)
它不必是透视表。这是我最接近我想要的
我当前路径的另一个问题是,它只考虑从查询中实际返回的数据源
,其中可能不包括系列所有数据源
中的完整列表
我怎样才能实现我所追求的目标?任何指针都将不胜感激。您可以按日期对数据源
进行分组,并检查每个组的所有键是否都在数据源
中,根据这些键构建了一个逻辑系列(这适用于具有字典理解功能的python 3):
您也可以使用以下方法:
数据:
一些解释:
In [83]: all_data_sources.ix[~all_data_sources.isin(df.data_source)]
Out[83]:
5 F
6 G
dtype: object
In [84]: pd.DataFrame(columns=all_data_sources.ix[~all_data_sources.isin(df.data_source)].values, index=x.index).fillna(0)
Out[84]:
F G
process_date
2016-10-01 0 0
2016-10-02 0 0
2016-10-03 0 0
2016-10-04 0 0
2016-10-05 0 0
非常感谢。请问在编制索引时,~
有什么用途?找不到太多@Franco,不客气~
是一个否定运算符,也称为not
运算符。非常感谢!这是非常简洁的:)。我甚至不知道有听写理解。
In [79]: x = pd.get_dummies(df.set_index('process_date').data_source)
In [80]: x
Out[80]:
A B C D E
process_date
2016-10-01 1 0 0 0 0
2016-10-02 0 1 0 0 0
2016-10-03 0 0 1 0 0
2016-10-04 0 0 0 1 0
2016-10-05 0 0 0 0 1
In [81]: new = pd.DataFrame(columns=all_data_sources.ix[~all_data_sources.isin(df.data_source)].values, index=x.index).fillna(0)
In [82]: pd.concat([x, new], axis=1).astype(bool)
Out[82]:
A B C D E F G
process_date
2016-10-01 True False False False False False False
2016-10-02 False True False False False False False
2016-10-03 False False True False False False False
2016-10-04 False False False True False False False
2016-10-05 False False False False True False False
In [77]: all_data_sources
Out[77]:
0 A
1 B
2 C
3 D
4 E
5 F
6 G
dtype: object
In [78]: df
Out[78]:
cost data_source process_date revenue
0 0.796895 A 2016-10-01 0.133634
1 0.222457 B 2016-10-02 0.111921
2 0.980005 C 2016-10-03 0.353150
3 0.332533 D 2016-10-04 0.686957
4 0.554089 E 2016-10-05 0.798600
In [83]: all_data_sources.ix[~all_data_sources.isin(df.data_source)]
Out[83]:
5 F
6 G
dtype: object
In [84]: pd.DataFrame(columns=all_data_sources.ix[~all_data_sources.isin(df.data_source)].values, index=x.index).fillna(0)
Out[84]:
F G
process_date
2016-10-01 0 0
2016-10-02 0 0
2016-10-03 0 0
2016-10-04 0 0
2016-10-05 0 0