如何解决多个数据帧之间复制期间无法对齐的索引问题

How to solve unalignable index issue during copy between multiple dataframes

我有两个数据帧 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']

虽然我已经尝试了下面的方法,但由于某些奇怪的原因,它 returns NA 我的所有 key_id

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 除了代码 returns 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  

使用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)

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)