Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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 Pandas中的高级透视表_Python_Pandas_Pivot Table - Fatal编程技术网

Python Pandas中的高级透视表

Python Pandas中的高级透视表,python,pandas,pivot-table,Python,Pandas,Pivot Table,我正在尝试优化Python Pandas中的一些表转换脚本,我正在尝试使用大量数据集(超过50k行)来提供这些脚本。我编写了一个脚本,它遍历每个索引并将值解析为新的数据帧(请参见下面的示例),但我遇到了性能问题。是否有任何函数可以在不迭代的情况下获得相同的结果 示例代码: from datetime import datetime import pandas as pd date1 = datetime(2019,1,1) date2 = datetime(2019,1,2) df = pd

我正在尝试优化Python Pandas中的一些表转换脚本,我正在尝试使用大量数据集(超过50k行)来提供这些脚本。我编写了一个脚本,它遍历每个索引并将值解析为新的数据帧(请参见下面的示例),但我遇到了性能问题。是否有任何函数可以在不迭代的情况下获得相同的结果

示例代码:

from datetime import datetime
import pandas as pd

date1 = datetime(2019,1,1)
date2 = datetime(2019,1,2)

df = pd.DataFrame({"ID": [1,1,2,2,3,3],
                  "date": [date1,date2,date1,date2,date1,date2],
                  "x": [1,2,3,4,5,6],
                  "y": ["a","a","b","b","c","c"]})


new_df = pd.DataFrame()
for i in df.index:

    new_df.at[df.at[i, "ID"], "y"] = df.at[i, "y"]

    if df.at[i, "date"] == datetime(2019,1,1):
        new_df.at[df.at[i, "ID"], "x1"] = df.at[i, "x"]
    elif df.at[i, "date"] == datetime(2019,1,2):
        new_df.at[df.at[i, "ID"], "x2"] = df.at[i, "x"]
输出:

   ID       date  x  y
0   1 2019-01-01  1  a
1   1 2019-01-02  2  a
2   2 2019-01-01  3  b
3   2 2019-01-02  4  b
4   3 2019-01-01  5  c
5   3 2019-01-02  6  c

   y   x1   x2
1  a  1.0  2.0
2  b  3.0  4.0
3  c  5.0  6.0
转换基本上按“ID”列对行进行分组,并从日期为2019-01-01的行中获取“x1”值,从日期为2019-01-02的行中获取“x2”值。“y”值在同一“ID”内相同。“ID”列成为新索引


我非常感谢你对这件事的任何建议

使用
pivot\u表
将获得您想要的:

result = df.pivot_table(index=['ID', 'y'], columns='date', values='x')
result.rename(columns={date1: 'x1', date2: 'x2'}).reset_index('y')

使用
pivot\u表
将获得您想要的:

result = df.pivot_table(index=['ID', 'y'], columns='date', values='x')
result.rename(columns={date1: 'x1', date2: 'x2'}).reset_index('y')