2024-04-24 12:29:53 发布
网友
我有3个CSV文件。每个数据框都有第一列作为人员的(字符串)名称,而每个数据框中的所有其他列都是该人员的属性。
如何将所有三个CSV文档“连接”在一起,以创建一个CSV,其中每一行具有该人员字符串名称的每个唯一值的所有属性?
pandas中的join()函数指定我需要一个多索引,但我不明白层次索引方案与基于单个索引进行连接有什么关系。
join()
join
join方法正是为这些类型的情况而构建的。您可以将任意数量的数据帧与之连接在一起。调用数据帧与传递的数据帧集合的索引联接。若要使用多个数据帧,必须将连接列放入索引中。
代码如下所示:
filenames = ['fn1', 'fn2', 'fn3', 'fn4',....] dfs = [pd.read_csv(filename, index_col=index_col) for filename in filenames)] dfs[0].join(dfs[1:])
使用@zero的数据,您可以执行以下操作:
df1 = pd.DataFrame(np.array([ ['a', 5, 9], ['b', 4, 61], ['c', 24, 9]]), columns=['name', 'attr11', 'attr12']) df2 = pd.DataFrame(np.array([ ['a', 5, 19], ['b', 14, 16], ['c', 4, 9]]), columns=['name', 'attr21', 'attr22']) df3 = pd.DataFrame(np.array([ ['a', 15, 49], ['b', 4, 36], ['c', 14, 9]]), columns=['name', 'attr31', 'attr32']) dfs = [df1, df2, df3] dfs = [df.set_index('name') for df in dfs] dfs[0].join(dfs[1:]) attr11 attr12 attr21 attr22 attr31 attr32 name a 5 9 5 19 15 49 b 4 61 14 16 4 36 c 24 9 4 9 14 9
如果你有3个数据帧,你可以试试这个
# Merge multiple dataframes df1 = pd.DataFrame(np.array([ ['a', 5, 9], ['b', 4, 61], ['c', 24, 9]]), columns=['name', 'attr11', 'attr12']) df2 = pd.DataFrame(np.array([ ['a', 5, 19], ['b', 14, 16], ['c', 4, 9]]), columns=['name', 'attr21', 'attr22']) df3 = pd.DataFrame(np.array([ ['a', 15, 49], ['b', 4, 36], ['c', 14, 9]]), columns=['name', 'attr31', 'attr32']) pd.merge(pd.merge(df1,df2,on='name'),df3,on='name')
或者,正如cwharland提到的
df1.merge(df2,on='name').merge(df3,on='name')
假设进口:
import pandas as pd
John Galt's answer基本上是一个reduce操作。如果我有多个数据帧,我会将它们放入这样的列表中(通过列表理解、循环或其他方式生成):
reduce
dfs = [df0, df1, df2, dfN]
假设它们有一些公共列,比如示例中的name,我将执行以下操作:
name
df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)
这样,您的代码就可以处理任意数量的数据帧。
编辑2016年8月1日:对于使用Python 3的用户,reduce已移动到functools。因此,要使用此函数,首先需要导入该模块:
functools
from functools import reduce
这是
join
方法的理想情况join
方法正是为这些类型的情况而构建的。您可以将任意数量的数据帧与之连接在一起。调用数据帧与传递的数据帧集合的索引联接。若要使用多个数据帧,必须将连接列放入索引中。代码如下所示:
使用@zero的数据,您可以执行以下操作:
如果你有3个数据帧,你可以试试这个
或者,正如cwharland提到的
假设进口:
John Galt's answer基本上是一个
reduce
操作。如果我有多个数据帧,我会将它们放入这样的列表中(通过列表理解、循环或其他方式生成):假设它们有一些公共列,比如示例中的
name
,我将执行以下操作:这样,您的代码就可以处理任意数量的数据帧。
编辑2016年8月1日:对于使用Python 3的用户,
reduce
已移动到functools
。因此,要使用此函数,首先需要导入该模块:相关问题 更多 >
编程相关推荐