Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 3.x 基于列值对DF列进行转置-熊猫_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 基于列值对DF列进行转置-熊猫

Python 3.x 基于列值对DF列进行转置-熊猫,python-3.x,pandas,Python 3.x,Pandas,我的df看起来像这样 param per per_date per_num 0 XYZ 1.0 2018-10-01 11.0 1 XYZ 2.0 2017-08-01 15.25 2 XYZ 1.0 2019-10-01 11.25

我的
df
看起来像这样

        param       per     per_date    per_num             
    0   XYZ         1.0     2018-10-01  11.0                
    1   XYZ         2.0     2017-08-01  15.25               
    2   XYZ         1.0     2019-10-01  11.25               
    3   XYZ         2.0     2019-08-01  15.71               
    4   XYZ         3.0     2020-10-01  11.50
    5   XYZ         NaN     NaN         NaN               
    6   MMG         1.0     2021-10-01  11.75               
    7   MMG         2.0     2014-01-01  14.00
    8   MMG         3.0     2021-10-01  12.50               
    9   MMG         1.0     2014-01-01  15.00
    10  LKG         NaN     NaN         NaN               
    11  LKG         NaN     NaN         NaN
  param per_1 per_date_1 per_num_1 per_2 per_date_2 per_num_2 per_3 per_date_3 per_num_3
0 XYZ   1     2018-10-01 11.0      2     2017-08-01 15.25     NaN   NaN        NaN        
1 XYZ   1     2019-10-01 11.25     2     2019-08-01 15.71     3     2020-10-01 11.50
2 XYZ   NaN   NaN        NaN       NaN   NaN        NaN       NaN   NaN        NaN
4 MMG   1     2021-10-01 11.75     2     2014-01-01 14.00     3     2021-10-01 12.50
5 MMG   1     2014-01-01 15.00     NaN   NaN        NaN       NaN   NaN        NaN
6 LKG   NaN   NaN        NaN       NaN   NaN        NaN       NaN   NaN        NaN
我需要这样的输出

        param       per     per_date    per_num             
    0   XYZ         1.0     2018-10-01  11.0                
    1   XYZ         2.0     2017-08-01  15.25               
    2   XYZ         1.0     2019-10-01  11.25               
    3   XYZ         2.0     2019-08-01  15.71               
    4   XYZ         3.0     2020-10-01  11.50
    5   XYZ         NaN     NaN         NaN               
    6   MMG         1.0     2021-10-01  11.75               
    7   MMG         2.0     2014-01-01  14.00
    8   MMG         3.0     2021-10-01  12.50               
    9   MMG         1.0     2014-01-01  15.00
    10  LKG         NaN     NaN         NaN               
    11  LKG         NaN     NaN         NaN
  param per_1 per_date_1 per_num_1 per_2 per_date_2 per_num_2 per_3 per_date_3 per_num_3
0 XYZ   1     2018-10-01 11.0      2     2017-08-01 15.25     NaN   NaN        NaN        
1 XYZ   1     2019-10-01 11.25     2     2019-08-01 15.71     3     2020-10-01 11.50
2 XYZ   NaN   NaN        NaN       NaN   NaN        NaN       NaN   NaN        NaN
4 MMG   1     2021-10-01 11.75     2     2014-01-01 14.00     3     2021-10-01 12.50
5 MMG   1     2014-01-01 15.00     NaN   NaN        NaN       NaN   NaN        NaN
6 LKG   NaN   NaN        NaN       NaN   NaN        NaN       NaN   NaN        NaN

如果看到
param
列具有重复的值,则会根据这些值创建转置的列名。此外,只要
param
值以
1
开头,就会创建一条新记录。如何实现这一点?

这里的主要问题是最后一个
LKG
组中的
NaN
s-首先用
cumcount
创建的
counter
替换缺少的值,然后分配给新列
per1

s = df['per'].isna().groupby(df['param']).cumsum()
df = df.assign(per1=df['per'].fillna(s).astype(int))
print (df)
   param  per    per_date  per_num  per1
0    XYZ  1.0  2018-10-01    11.00     1
1    XYZ  2.0  2017-08-01    15.25     2
2    XYZ  1.0  2019-10-01    11.25     1
3    XYZ  2.0  2019-08-01    15.71     2
4    XYZ  3.0  2020-10-01    11.50     3
5    XYZ  NaN         NaN      NaN     1
6    MMG  1.0  2021-10-01    11.75     1
7    MMG  2.0  2014-01-01    14.00     2
8    MMG  3.0  2021-10-01    12.50     3
9    MMG  1.0  2014-01-01    15.00     1
10   LKG  NaN         NaN      NaN     1
11   LKG  NaN         NaN      NaN     2
然后使用组创建
多索引
,通过
1进行比较
并通过
unstack
进行累积和和重塑:

g = df['per1'].eq(1).cumsum()
df = df.set_index(['param', 'per1',g]).unstack(1).sort_index(axis=1, level=1)
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index(level=1, drop=True).reset_index()
print (df)
  param  per_1  per_date_1  per_num_1  per_2  per_date_2  per_num_2  per_3  \
0   LKG    NaN         NaN        NaN    NaN         NaN        NaN    NaN   
1   MMG    1.0  2021-10-01      11.75    2.0  2014-01-01      14.00    3.0   
2   MMG    1.0  2014-01-01      15.00    NaN         NaN        NaN    NaN   
3   XYZ    1.0  2018-10-01      11.00    2.0  2017-08-01      15.25    NaN   
4   XYZ    1.0  2019-10-01      11.25    2.0  2019-08-01      15.71    3.0   
5   XYZ    NaN         NaN        NaN    NaN         NaN        NaN    NaN   

   per_date_3  per_num_3  
0         NaN        NaN  
1  2021-10-01       12.5  
2         NaN        NaN  
3         NaN        NaN  
4  2020-10-01       11.5  
5         NaN        NaN  

如果
XYZ
per
中存在
NaN
值,我如何处理该值以从
1
开始填充。现在,它给出了每个值的
总和。如果需要,我可以编辑帖子。@user9431057-组末尾的
param
列总是缺少值吗?不总是,但在一些
param
值中。但是,在我的数据中,我遇到了一个错误:
ValueError:Index包含重复的条目,无法为行
df=df重塑
。设置索引(['param',per1',g]).unstack(1).排序索引(轴=1,级别=1)
。我用谷歌搜索了一下,但还没找到运气。有什么想法吗?@user9431057-一个想法是匿名数据-检查