【问题标题】:Adding new records to a dataframe for variables extracted from the same dataframe为从同一数据框中提取的变量添加新记录到数据框中
【发布时间】:2019-11-07 13:52:18
【问题描述】:

我正在尝试合并数据集中的变量。 我有这样的事情:

import pandas as pd
import numpy as np


data = np.array([[160,90,'skirt_trousers', 'tight_comfy'],[180,100,'trousers_skirt', 'long_short']])
dford = pd.DataFrame(data, columns = ['height','size','order', 'preference'])

我正试图让它变成这样:

dataForTarget = np.array([['o1',160,90,'skirt', 'tight'],['o2', 180,100,'trousers', 'long'],['o1',160,90,'trousers', 'comfy'],['o2', 180,100,'skirt', 'short']])
Targetdford = pd.DataFrame(dataForTarget, columns = ['orderID','height','size','order', 'preference'])

作为第一步,我从字符串中提取了尽可能多的数据, 然后清理它们:

variables = dford.columns.tolist()
variables.append('ord1')
secondord = dford.order.str.extractall (r'_(.*)')
secondord = secondord.unstack()
secondord.columns = secondord.columns.droplevel()
dford1 = dford.join(secondord)
dford1. columns = variables
dford1.order = dford1.order.str.replace(r'(_.*)','')


variables = dford1.columns.tolist()
variables.append('pref1')
secondpref = dford.preference.str.extractall (r'_(.*)')
secondpref = secondpref.unstack()
secondpref.columns = secondpref.columns.droplevel()
dford2 = dford1.join(secondpref)
dford2. columns = variables
dford2.order = dford2.order.str.replace(r'(_.*)','')

这让我在这里:

在这个阶段,我不知道如何将这些新信息添加为观察结果(按行)。

我能想到的最好的方法如下,但由于索引包含而失败 重复条目。但即使它没有失败,我怀疑它会 只有在我尝试填充缺失值时才有用。

但我无处可去。

dford3 = dford2.rename(columns = {'ord1': 'order', 'pref1': 'preference'})
dford3= dford3.stack()
dford3= dford3.unstack()

【问题讨论】:

    标签: python pandas dataframe copy reshape


    【解决方案1】:

    Series.str.splitDataFrame.stackconcat 一起用于新DataFrame,并由DataFrame.join 添加到原始数据:

    df = pd.concat([dford.pop('order').str.split('_', expand=True).stack().rename('order'), 
                    dford.pop('preference').str.split('_', expand=True).stack().rename('preference')], axis=1)
    
    
    dford = (dford.join(df.reset_index(level=1)).rename_axis('orderID')
                  .reset_index()
                  .sort_values(['level_1','orderID'])
                  .drop('level_1', 1)
                  .reset_index(drop=True)
                  .assign(orderID = lambda x: 'o' + x['orderID'].add(1).astype('str')))
    
    print (dford)
      orderID height size     order preference
    0      o1    160   90     skirt      tight
    1      o2    180  100  trousers       long
    2      o1    160   90  trousers      comfy
    3      o2    180  100     skirt      short
    

    【讨论】:

      【解决方案2】:

      使用DataFrame.apply + Series.str.split。 将生成的数据帧与pd.concat 连接并使用Series.map 创建HightSize 系列:

      df=pd.concat([df.T for df in dford[['order','preference']].apply(lambda x: x.str.split('_',expand=True),axis=1)]).rename_axis(index='OrderID').reset_index() 
      
      df['height']=df['OrderID'].map(dford['height'])
      df['size']=df['OrderID'].map(dford['size'])
      print(df)
      
         OrderID     order preference height size
      0        0     skirt      tight    160   90
      1        1  trousers      comfy    180  100
      2        0  trousers       long    160   90
      3        1     skirt      short    180  100
      

      最后在OrderID列加一,加上字符o

      df['OrderID']='o'+df['OrderID'].add(1).astype('str')
      print(df)
      
        OrderID     order preference height size
      0      o1     skirt      tight    160   90
      1      o2  trousers      comfy    180  100
      2      o1  trousers       long    160   90
      3      o2     skirt      short    180  100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多