【问题标题】:How to solve unalignable index issue during copy between multiple dataframes如何解决多个数据帧之间复制期间无法对齐的索引问题
【发布时间】:2021-07-07 07:03:39
【问题描述】:

我有两个数据框 dfhash_file 如下所示

df = pd.DataFrame({'source_description':['test1', 'test1','test2','test3','test5']})

hash_file = pd.DataFrame({'source_code':['test1','test2','test3','test5'],
                          'hash_id':[911,512,713,814]})

id_file =  hash_file.set_index(['source_code'])['hash_id']


cols = ["seq_id","desc","key_id"]
test_df = pd.DataFrame(columns=cols)

我想做两件事

a) 将source_description 复制到test_df['desc']

b) 将对应的hash_id 复制到test_df['key_id']

虽然我已经尝试了以下方法,但由于某种奇怪的原因,它为我的所有 key_id 行返回 NA

test_df["seq_id"] = df.index + 1
test_df["desc"] = df['source_description']
test_df["key_id"] = df['source_description'].map(id_file)

但是,当我仅单独尝试以下行时,它工作正常并且能够看到在 jupyter notebook 提示符中显示的 key_ids。

 df['source_description'].map(id_file)

但是当我出于某种原因将其分配给test_df['key_id] 时,我只看到NA

我在创建 test_df 和分配列名时是否犯了任何错误?

我还尝试清除 jupyter notbook cache, reset the kernel 所做的一切,但代码仍然返回 NA。虽然我上面显示的只有 3 列,但我的真实数据有超过 25 列,我对所有 25 列都做了类似的分配选项。是不是像 Jupyter notebook 厌倦了作业?我不知道为什么正确的代码返回的结果不正确

请帮帮我吗?

我希望我的输出如下所示

seq_id    desc    key_id
  1       test1    911
  2       test1    911
  3       test2    512
  4       test3    713
  5       test5    814  

【问题讨论】:

    标签: python pandas dataframe pandas-groupby series


    【解决方案1】:

    NA 的这个问题是由于无法对齐的索引。

    重置数据帧test_dfdf 的索引。然后尝试问题中的代码,它应该可以正常工作

    我做了以下

    df = df.reset_index(drop=True)  #updated drop command as per suggestion below
    test_df = test_df.reset_index(drop=True) #updated drop command as per suggestion below
    test_df["seq_id"] = df.index + 1
    test_df["desc"] = df['source_description']
    test_df["key_id"] = df['source_description'].map(id_file)
    

    【讨论】:

      【解决方案2】:

      使用df.merge:

      In [2527]: test_df = df.merge(hash_file, left_on='source_description', right_on='source_code')[['source_description', 'hash_id']]
      
      In [2529]: test_df.columns = ['desc', 'key_id']
      
      In [2534]: test_df = test_df.reset_index().rename(columns={'index':'seq_id'})
      
      In [2535]: test_df.seq_id = test_df.seq_id + 1
      
      In [2536]: test_df
      Out[2536]: 
         seq_id   desc  key_id
      0       1  test1     911
      1       2  test1     911
      2       3  test2     512
      3       4  test3     713
      4       5  test5     814
      

      或:

      你可以像这样调整你的代码:

      test_df["seq_id"] = df.index + 1
      test_df["desc"] = df['source_description']
      test_df["key_id"] = test_df['desc'].map(id_file)
      

      【讨论】:

      • 谢谢,点赞,知道我的代码有什么问题吗?
      • 您实际上不需要单独创建 test_df,只需将df.merge 输出的列子集即可。这应该更有效。
      • @TheGreat 在我的回答中添加了解释您的代码有什么问题。请检查。
      • 问题是即使我复制df[source_description],我也只能看到NA.. 有点奇怪.. 因此,key_id 也是NA
      • 但是如果我只是在我的 jupyter 单元格中键入 df['source_description'].map(id_file) 而不将其分配给 test_df['key_id],我确实看到了 key_ids... 问题是当我分配它时,它返回 NA .不确定我的 jupyter notebook 或其他东西是否有任何问题
      猜你喜欢
      • 2014-12-09
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多