Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫数据帧将特定日期范围的长格式数据转换为宽格式数据_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫数据帧将特定日期范围的长格式数据转换为宽格式数据

Python 熊猫数据帧将特定日期范围的长格式数据转换为宽格式数据,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试将时间序列数据从长格式转换为宽格式。数据如下所示 +======+==========+======+======+ | Name | Date | Val1 | Val2 | +======+==========+======+======+ | A | 1/1/2018 | 1 | 2 | +------+----------+------+------+ | B | 1/1/2018 | 2 | 3 | +------+--------

我正在尝试将时间序列数据从长格式转换为宽格式。数据如下所示

+======+==========+======+======+
| Name |   Date   | Val1 | Val2 |
+======+==========+======+======+
| A    | 1/1/2018 |    1 |    2 |
+------+----------+------+------+
| B    | 1/1/2018 |    2 |    3 |
+------+----------+------+------+
| C    | 1/1/2018 |    3 |    4 |
+------+----------+------+------+
| D    | 1/4/2018 |    4 |    5 |
+------+----------+------+------+
| A    | 1/4/2018 |    5 |    6 |
+------+----------+------+------+
| B    | 1/4/2018 |    6 |    7 |
+------+----------+------+------+
| C    | 1/4/2018 |    7 |    8 |
+------+----------+------+------+
我的最终目标是为
01/01/2018
01/04/2018
的日期范围创建一个数据透视表。由于在日期
2018年2月1日
2018年3月1日
上没有值,我希望它们用
NaN
填充。为了进一步简化,我的最终表格是这样的:

+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
|   | Val1.1/1/2018 | Val2.1/1/2018 | Val1.1/2/2018 | Val2.1/2/2018 | Val1.1/3/2018 | Val2.1/3/2018 | Val1.1/4/2018 | Val2.1/4/2018 |
+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
| A | 1             | 2             | NULL          | NULL          | NULL          | NULL          |             5 |             6 |
| B | 2             | 3             | NULL          | NULL          | NULL          | NULL          |             6 |             7 |
| C | 3             | 4             | NULL          | NULL          | NULL          | NULL          |             7 |             8 |
| D | NULL          | NULL          | NULL          | NULL          | NULL          | NULL          |             4 |             5 |
+---+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
根据我的理解,有两个步骤可以达到上述目标。 首先是以长格式填写数据,日期不在
2018年1月1日
2018年4月1日
之间,即is
2018年2月1日
2018年3月1日

第二步也是最后一步是以广泛的格式透视数据

为了实现第一步,我提到了这一点。 根据答案,如果多行中有相似的日期
df。重新索引(日期范围)
将引发以下错误,
ValueError:cannot reindex from a replicate axis
,这是真的,为了克服这一问题,我遵循了以下代码

df['Date'] =  pd.to_datetime(df['Date'], format='%m/%d/%Y')
df.set_index('Date', inplace = True)

date_range = pd.date_range('2018-01-01', '2018-01-04', freq='D')
df = df.loc(date_range)
df1 = df.pivot_table(index='Name', columns='Date', aggfunc='sum')
上述代码导致以下错误:

TypeError: unhashable type: 'DatetimeIndex'
我使用这行代码解决了上述问题

df = df.loc[date_range,:]
虽然我能够获得所需的长格式,但Python给出了如下警告:

Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
上面的警告,我认为表明我实现缺少日期的长格式表的方法是不正确的,对吗?如果是的话,我应该怎么做呢?此外,我将如何获得我想要作为最终表格的宽格式表格

编辑: 我访问了只包含日期的透视表
'01/01/2018'
'01/04/2018'
。下面是一段代码

df['Date'] =  pd.to_datetime(df['Date'], format='%m/%d/%Y')
df.set_index('Date', inplace = True)

date_range = pd.date_range('2018-01-01', '2018-01-04', freq='D')
df = df.loc(date_range)
df1 = df.pivot_table(index='Name', columns='Date', aggfunc='sum')

首先重新索引数据框以添加缺失的日期。然后旋转并合并列

idx = pd.MultiIndex.from_product([df.Name.unique(), pd.date_range(df.Date.min(), df.Date.max())])

df = df.set_index(['Name','Date']).reindex(idx).reset_index().rename(columns = {'level_0':'Name', 'level_1':'Date'})

df.Date = df.Date.dt.strftime('%m/%d/%Y')
new_df = df.pivot('Name', 'Date', ['Val1', 'Val2'])
new_df.columns = new_df.columns.map('.'.join)

    Val1.01/01/2018 Val1.01/02/2018 Val1.01/03/2018 Val1.01/04/2018 Val2.01/01/2018 Val2.01/02/2018 Val2.01/03/2018 Val2.01/04/2018
Name                                
A   1.0             NaN             NaN              5.0            2.0 NaN NaN 6.0
B   2.0             NaN             NaN              6.0            3.0 NaN NaN 7.0
C   3.0             NaN             NaN              7.0            4.0 NaN NaN 8.0
D   NaN             NaN             NaN              4.0            NaN NaN NaN 5.0

在第
new\u df=df.pivot('Name','Date',['Val1','Val2'])行,我收到一个错误,
异常:数据必须是一维的
您的数据集中是否有更多的列?否。以下是
df.columns
的结果,
索引(['Name','Date Val1','Val2'],dtype='object')
无法重现错误,能否提供更大的示例df?将python版本从3.5.x更改为3.6.5后,错误得到解决。