根据其他列的值为Pandas Dataframe创建列

阿西夫·伊克巴尔(Asif Iqbal):

我正在使用Python3.7和Pandas v0.25.3。我有一个这样的数据框,

pri_col col1 col2        Date
     r1    3    4  2020-09-10
     r2    4    1  2020-09-10
     r1    2    7  2020-09-11
     r3    6    4  2020-09-11

我想要类似的东西

pri_col col1_2020-09-10 col2_2020-09-10 col1_2020-09-11 col2_2020-09-11
   r1               3               4             NaN             NaN
   r2               4               1             NaN             NaN
   r1             NaN             NaN               2               7
   r3             NaN             NaN               6               4

我尝试了以下代码:

import pandas as pd
df = pd.DataFrame([['r1', '3', '4', '2020-09-10'], ['r2', '4', '1', '2020-09-10'], ['r1', '2', '7', '2020-09-11'], ['r3', '6', '4', '2020-09-11']], columns=['pri_col', 'col1', 'col2', 'Date'])
print(df)
df_list = list()
for key, item in df.groupby('Date'):
    item = item.drop('Date', axis=1)
    item.columns = ['pri_col']+[str(x)+'_'+str(key) for x in item.columns if x != 'pri_col']
    df_list.append(item)
finDf = pd.concat(df_list, sort=False)
print(finDf)

但是,此代码并未针对大型数据帧进行优化。是否可以在熊猫中对此应用程序进行矢量化实现?如果代码是矢量化的,多层数据帧对我也很好。在顶层,我可以具有“日期”列的值,在顶层,我可以具有列的值。

耶斯雷尔:

用进行重塑DataFrame.set_indexDataFrame.stack并且DataFrame.unstack是第一个想法,需要将其展平MultiIndex

df = (df.set_index(['pri_col','Date'], append=True)
        .stack()
        .unstack([3,2])
        )
df.columns = [f'{a}-{b}' for a, b in df.columns]
df = df.reset_index(level=1).
print (df)
  pri_col  col1-2020-09-10  col2-2020-09-10  col1-2020-09-11  col2-2020-09-11
0      r1              3.0              4.0              NaN              NaN
1      r2              4.0              1.0              NaN              NaN
2      r1              NaN              NaN              2.0              7.0
3      r3              NaN              NaN              6.0              4.0

或通过DataFrame.melt重塑DataFrame.pivot

df = (df.reset_index()
        .melt(id_vars=['index','pri_col','Date'], 
              var_name='cols',
              value_name='val')
        .pivot(index=['index','pri_col'],
               columns=['cols','Date'],
               values='val'))
df.columns = [f'{a}-{b}' for a, b in df.columns]
df = df.reset_index(level=1).rename_axis(None)
print (df)
  pri_col  col1-2020-09-10  col1-2020-09-11  col2-2020-09-10  col2-2020-09-11
0      r1              3.0              NaN              4.0              NaN
1      r2              4.0              NaN              1.0              NaN
2      r1              NaN              2.0              NaN              7.0
3      r3              NaN              6.0              NaN              4.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Pandas / Python:根据行值和其他DataFrame设置新列的值

Pandas DataFrame-根据其他列的值填充列的NaN

熊猫根据其他列的值创建新的列ID

根据其他列中的NA值创建新列

pandas dataframe根据相应行的其他列更新列值

pandas Dataframe:根据其他列创建标签的新列

根据python pandas中其他列的值创建新列

根据其他列的分组依据为列设置值

如果值计数低于阈值,则将列值映射为“其他”-分类列-Pandas Dataframe

如何根据Pandas DataFrame中其他列的值仅对某个列的某些元素求和?

根据值Pandas Dataframe获取所有其他列

根据其他列值创建Pandas Dataframe行

根据Pandas DataFrame中其他列的条件创建新列

根据其他列中的值在python 3(pandas)数据框中创建新列

根据其他列在Pandas DataFrame中创建新列

根据其他列中的多个条件创建列值

根据其他列值创建列

Pandas - 根据其他 2 列的值创建一列

pandas:根据其他列中的条件创建具有字符串值的列

根据其他列中的值创建新列

根据其他列值/ Pandas -Python 在数据框中创建 ID 列

根据来自其他列 pandas python 的特定值创建一列

根据其他列的值替换 pandas.DataFrame 的 NaN 值(根据公式)

Pandas - 根据其他列的名称创建具有值的新列

根据其他列上的值对列进行分组以在 Pandas 中创建新列

如何根据其他两列的值在 DataFrame 中创建新列

如何根据其他列值将列添加到 pandas DataFrame?

Pandas:根据其他列的文本值创建新列

Python pandas - groupby之后,如何根据其他列中的值创建新列