【问题标题】:Merging Dataframe1 rows into Dataframe2 using existing column headers - Python Pandas使用现有列标题将 Dataframe1 行合并到 Dataframe2 - Python Pandas
【发布时间】:2019-10-08 15:31:06
【问题描述】:

我正在尝试构建一个 python 数据框来捕获初始数据集,然后在包含数据的 csv 文件在指定文件夹位置可用时更新字段。我已经建立了我的初始表并将其保存到 csv,但是当我重新打开表并尝试引入下一个文本文件数据时,我每次运行代码时都会不小心复制新数据的标题。读取新文本文件并将数据附加到基于通用列名的行的最佳方法是什么?

我目前的尝试是将新的文本文件构建到他们自己的数据库中,匹配初始导入的列标题,并将公共标题与起始数据集合并。然而,就像我说的那样,这些列只是不断复制自己,然后添加 _x、_y 等。

初始数据帧示例...

Line Name,Bearing,SOL X,SOL Y,EOL X,EOL Y,FSP 0.5m,FSP 1m,Length km,Length m,LSP 0.5m,LSP 1m,Date,Julian Day,Seq,Storage Db,Time Start,SOG Start,Fix Start,SOL Bearing,Line Length,SOL Easting,SOL Northing,Obs SOL X,Obs SOL Y,Time End,Fix End,SOG End,Planned EOL X,Planned EOL Y,Obs EOL X,Obs EOL Y
A901,38.67269998,568453.03,4343701.73,569156.01,4344580.05,250,125,1.125,1125,2500,1250,,,,,,,,,,,,,,,,,,,,
A902,38.67269998,568476.45,4343682.99,569179.43,4344561.31,250,125,1.125,1125,2500,1250,,,,,,,,,,,,,,,,,,,,
A903,38.67269998,568499.87,4343664.24,569202.85,4344542.56,250,125,1.125,1125,2500,1250,,,,,,,,,,,,,,,,,,,,

要合并的数据样本...

,Line Name,Date,Julian Day,Seq,Storage Db,Time Start,SOG Start,Fix Start,SOL Bearing,Line Length,SOL Easting,SOL Northing,Obs SOL X,Obs SOL Y,Time End,Fix End,SOG End,Planned EOL X,Planned EOL Y,Obs EOL X,Obs EOL Y
0,A901,9/26/2019,269,37,0037_JD269_X331 - 0001.db,09:29:54,2.73,12792,128.67,1000.0,587985.95,4380278.68,587811.22,4380427.4,09:43:51,15594,3.28,588766.68,4379653.81,588901.53,4379545.64
1,A902,9/26/2019,269,38,0038_JD269_M104 - 0001.db,11:38:24,3.69,98260,218.67,42875.0,591391.62,4383593.91,591626.99,4383892.87,17:40:02,25764,3.02,564600.29,4350120.19,568980.53,4355589.75
2,A903,9/29/2019,273,80,0080_JD273_M305 - 0001.db,00:50:53,3.64,27721,38.67,1125.0,576455.88,4351038.29,576365.15,4350932.06,01:03:26,30615,3.78,577158.86,4351916.61,577275.9,4352057.35

我尝试过使用不同的规则组合进行合并、附加和连接,但没有任何运气。一些错误,其他重复列...

df_proj = pd.concat([df_in,df_acc], axis=1,sort=False)

df_proj = pd.merge(df_in, df_acc, on='Line Name', how = 'right')

我试图在没有运气的情况下找到此类问题的示例,我以错误的方式解决了这个问题。也许我不应该一开始就将新的文本文件视为他们自己的数据框。但任何帮助将不胜感激。谢谢!

编辑:

预期的结果应该是这样的......

Line Name,Bearing,SOL X,SOL Y,EOL X,EOL Y,FSP 0.5m,FSP 1m,Length km,Length m,LSP 0.5m,LSP 1m,Date,Julian Day,Seq,Storage Db,Time Start,SOG Start,Fix Start,SOL Bearing,Line Length,SOL Easting,SOL Northing,Obs SOL X,Obs SOL Y,Time End,Fix End,SOG End,Planned EOL X,Planned EOL Y,Obs EOL X,Obs EOL Y
A901,38.67269998,568453.03,4343701.73,569156.01,4344580.05,250,125,1.125,1125,2500,1250,9/26/2019,269,37,0037_JD269_X331 - 0001.db,09:29:54,2.73,12792,128.67,1000.0,587985.95,4380278.68,587811.22,4380427.4,09:43:51,15594,3.28,588766.68,4379653.81,588901.53,4379545.64
A902,38.67269998,568476.45,4343682.99,569179.43,4344561.31,250,125,1.125,1125,2500,1250,9/26/2019,269,38,0038_JD269_M104 - 0001.db,11:38:24,3.69,98260,218.67,42875.0,591391.62,4383593.91,591626.99,4383892.87,17:40:02,25764,3.02,564600.29,4350120.19,568980.53,4355589.75
A903,38.67269998,568499.87,4343664.24,569202.85,4344542.56,250,125,1.125,1125,2500,1250,9/29/2019,273,80,0080_JD273_M305 - 0001.db,00:50:53,3.64,27721,38.67,1125.0,576455.88,4351038.29,576365.15,4350932.06,01:03:26,30615,3.78,577158.86,4351916.61,577275.9,4352057.35

【问题讨论】:

  • 处理后可以添加预期的输出吗?
  • @jezrael 编辑已添加!谢谢!

标签: python python-3.x pandas numpy dataframe


【解决方案1】:

如果需要用另一个DataFrame替换缺失值的解决方案:

df = (df_in.set_index('Line Name')
           .combine_first(df_acc.set_index('Line Name'))
           .reset_index()
           .reindex(columns=df_in.columns))
print (df)
  Line Name  Bearing      SOL X       SOL Y      EOL X       EOL Y  FSP 0.5m  \
0      A901  38.6727  568453.03  4343701.73  569156.01  4344580.05       250   
1      A902  38.6727  568476.45  4343682.99  569179.43  4344561.31       250   
2      A903  38.6727  568499.87  4343664.24  569202.85  4344542.56       250   

   FSP 1m  Length km  Length m  ...  SOL Northing  Obs SOL X   Obs SOL Y  \
0     125      1.125      1125  ...    4380278.68  587811.22  4380427.40   
1     125      1.125      1125  ...    4383593.91  591626.99  4383892.87   
2     125      1.125      1125  ...    4351038.29  576365.15  4350932.06   

   Time End  Fix End SOG End Planned EOL X  Planned EOL Y  Obs EOL X  \
0  09:43:51  15594.0    3.28     588766.68     4379653.81  588901.53   
1  17:40:02  25764.0    3.02     564600.29     4350120.19  568980.53   
2  01:03:26  30615.0    3.78     577158.86     4351916.61  577275.90   

    Obs EOL Y  
0  4379545.64  
1  4355589.75  
2  4352057.35  

[3 rows x 32 columns]

如果需要concatLine Name 一起删除NaNs 列:

df_proj = (pd.concat([df_in.set_index('Line Name').dropna(how='all', axis=1),
                     df_acc.set_index('Line Name')], axis=1, sort=False)
             .reset_index())
print (df_proj)
  Line Name  Bearing      SOL X       SOL Y      EOL X       EOL Y  FSP 0.5m  \
0      A901  38.6727  568453.03  4343701.73  569156.01  4344580.05       250   
1      A902  38.6727  568476.45  4343682.99  569179.43  4344561.31       250   
2      A903  38.6727  568499.87  4343664.24  569202.85  4344542.56       250   

   FSP 1m  Length km  Length m  ...  SOL Northing  Obs SOL X   Obs SOL Y  \
0     125      1.125      1125  ...    4380278.68  587811.22  4380427.40   
1     125      1.125      1125  ...    4383593.91  591626.99  4383892.87   
2     125      1.125      1125  ...    4351038.29  576365.15  4350932.06   

   Time End  Fix End SOG End Planned EOL X  Planned EOL Y  Obs EOL X  \
0  09:43:51    15594    3.28     588766.68     4379653.81  588901.53   
1  17:40:02    25764    3.02     564600.29     4350120.19  568980.53   
2  01:03:26    30615    3.78     577158.86     4351916.61  577275.90   

    Obs EOL Y  
0  4379545.64  
1  4355589.75  
2  4352057.35  

[3 rows x 32 columns]

编辑:

检查重复项:

print (df_in[df_in['Line Name'].duplicated(keep=False)])
print (df_acc[df_acc['Line Name'].duplicated(keep=False)])

要通过Line Name 删除重复项,请使用:

df_in = df_in.drop_duplicates('Line Name')
df_acc = df_acc.drop_duplicates('Line Name')

【讨论】:

  • 嗨@jezrael,感谢您的反馈!您发布的结果看起来很棒。但是,当我应用于完整大小的数据框时,我遇到了一个奇怪的 ValueError ... ValueError:传递值的形状是 (220, 52),索引意味着 (219, 52) 我肯定会以此为基础,看看如果我可以隔离问题,但如果您有任何建议,我将不胜感激!干杯。
  • @DennisWilson - 一个想法 - Line NameDataFrames 都是唯一的?
  • @DennisWilson - 因为我认为错误意味着存在一个欺骗值。
  • @DennisWilson - 通过print (df_in[df_in['Line Name'].duplicated(keep=False)])print (df_acc[df_acc['Line Name'].duplicated(keep=False)]) 测试它
  • 是的,你是对的,代码运行良好!感谢您进行额外的编辑以帮助我进行故障排除。
【解决方案2】:

假设您的起始数据框为df_in

columns = df_in.columns
df_proj = pd.concat([df_in,df_acc[columns]], axis=0,sort=False)

【讨论】:

  • 嗨拉吉斯!谢谢你的建议。使用这种方法时出现错误.... KeyError: "['SOL X', 'LSP 0.5m', 'EOL Y', 'EOL X', 'FSP 0.5m', 'Bearing', 'SOL Y', 'Length km', 'Distance Sailed', 'LSP 1m', 'Length m', 'FSP 1m'] not in index" 有什么想法吗?
  • 这是因为第二个数据帧没有主数据帧中的所有列。您想合并两个具有 nan 值的数据帧吗?
【解决方案3】:

您可以执行以下操作:

#using append 
final_df = df_in.append(df_acc)

使用axis=0,意思是row wise

df_proj = pd.concat([df_in,df_acc], axis=0,sort=False)

【讨论】:

  • 嘿@dexter 感谢您的回复!这会将数据帧放在一起,但不会合并行名称。这个想法是有一个单行,其中包含基于“行名称”列的输入数据(计划行数据)和记录数据(df_acc)。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2021-12-03
相关资源
最近更新 更多