Python 如何重塑Pandas数据框以显示列中的某些值每天是否存在?

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

我正在编写一个脚本来查询数据库并返回一个数据帧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-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