如何解决多个数据帧之间复制期间无法对齐的索引问题
How to solve unalignable index issue during copy between multiple dataframes
我有两个数据帧 df
和 hash_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_df
和 df
的索引。然后试一下题中的代码,应该没问题
我做了以下
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)
我有两个数据帧 df
和 hash_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_df
和 df
的索引。然后试一下题中的代码,应该没问题
我做了以下
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)