合并熊猫中的两个数据框
Posted
技术标签:
【中文标题】合并熊猫中的两个数据框【英文标题】:Merge two dataframe in pandas 【发布时间】:2017-09-02 07:41:12 【问题描述】:我正在使用以下代码合并两个 csv(数据框):
import pandas as pd
a = pd.read_csv(file1,dtype='student_id': str)
df = pd.read_csv(file2)
c=pd.merge(a,df,on='test_id',how='left')
c.to_csv('test1.csv', index=False)
我有以下 CSV 文件
文件1:
test_id, student_id
1, 01990
2, 02300
3, 05555
文件2:
test_id, result
1, pass
3, fail
合并后
test_id, student_id , result
1, 1990, pass
2, 2300,
3, 5555, fail
如果您注意到 student_id 在开头附加了 0 并且它应该被视为文本,但在合并并使用 to_csv
函数后,它会将其转换为数字并删除前导 0。
即使在 to_csv 之后,我如何才能将列保持为“文本”?
我认为它的 to_csv 函数可以再次保存为数字 在读取 csv 时添加了 dtype='student_id': str .. 但在将其保存为 to_csv .. 它再次将其转换为数字
【问题讨论】:
【参考方案1】:a = pd.read_csv(file1, dtype='test_id': object)
df = pd.read_csv(file2, dtype='test_id': object)
================================================ ===============
In[28]: pd.merge(a, b, on='test_id', how='left')
Out[28]:
test_id student_id result
0 01 1990 pass
1 02 2300 NaN
2 003 5555 fail
【讨论】:
【参考方案2】:它不是在merge
上删除前导零,而是在read_csv
上删除它。您可以通过在导入时指定该列是字符串来解决此问题:
a = pd.read_csv('file1.csv', dtype='student_id': str, skipinitialspace=True)
重要的部分是dtype
参数。您是在告诉 pandas 将此列作为字符串导入。 skipinitialspace
参数设置为True,因为列标题是用空格定义的,所以我们去掉它:
test_id, student_id
^ The student_id starts here, at the space
最终代码如下所示:
a = pd.read_csv('file1.csv', dtype='student_id': str, skipinitialspace=True)
df = pd.read_csv('file2.csv')
results = a.merge(df, how='left', on='test_id')
results
数据框如下所示:
test_id student_id result
0 1 01990 pass
1 2 02300 NaN
2 3 05555 fail
那么当你运行to_csv
你的结果应该是:
test_id,student_id, result
1,01990, pass
2,02300,
3,05555, fail
【讨论】:
我尝试了您的解决方案。添加了“a = pd.read_csv('file1.csv', dtype='student_id': str)”。但是在将其保存为 c.to_csv('test1.csv', index=False).. 如果你打开这个 test1.csv 文件......你会看到前导零消失了。所以我认为它的 to_csv 函数删除了前导零。并将其视为数字 @MadhuraMhatre,你确定吗?在文本编辑器中打开 CSV 文件,而不是在 Excel 中。 Excel 在骗你。 Excel display 与 Text Display。请记住,CSV 不是 Excel 文档。【参考方案3】:使用join
的解决方案,首先需要read_csv
和参数dtype
将student_id
转换为string
并通过skipinitialspace
删除空格:
df1 = pd.read_csv(file1, dtype='student_id': str, skipinitialspace=True)
df2 = pd.read_csv(file2, skipinitialspace=True)
df = df1.join(df2.set_index('test_id'), on='test_id')
print (df)
test_id student_id result
0 1 01990 pass
1 2 02300 NaN
2 3 05555 fail
【讨论】:
尝试了您的解决方案。添加了“a = pd.read_csv('file1.csv', dtype='student_id': str)”。但是在将其保存为 c.to_csv('test1.csv', index=False).. 如果你打开这个 test1.csv 文件......你会看到前导零消失了。所以我认为它的 to_csv 函数删除了前导零。并将其视为数字 如果使用dtype='student_id': str
则强制列为字符串类型。我总是测试to_csv
,它工作得很好。你的熊猫是什么版本的?
@jezrael,我怀疑他们正在 Excel 中查看 CSV。 Excel 在前导零的问题上向他们撒谎。在我的回答中,我在comment 上提供了一个快速截图。
嗯。我总是用文本编辑器测试,也许这可能是个问题。【参考方案4】:
警告请使用merge
或join
。提供此答案是为了让您了解 pandas 为您提供的灵活性以及有多少种不同的方法可以回答同一个问题。
a = pd.read_csv('file1.csv', converters=dict(student_id=str), skipinitialspace=True)
df = pd.read_csv('file2.csv')
results = pd.concat(
[d.set_index('test_id') for d in [a, df]],
axis=1, join='outer'
).reset_index()
【讨论】:
呸,我觉得这太复杂了,你怎么看? 教育...对完成工作的多种方式的看法。以上是关于合并熊猫中的两个数据框的主要内容,如果未能解决你的问题,请参考以下文章