【问题标题】:Intersection of multiple pandas dataframes多个熊猫数据框的交集
【发布时间】:2017-03-24 19:51:30
【问题描述】:

我在列表中有许多数据框 (100):

frameList = [df1,df2,..,df100]

每个数据框都有两列DateTimeTemperature

我想将公共 DateTime 列上的所有数据框相交,并将它们的所有 Temperature 列组合/合并到一个大数据框中:来自 df1 的温度,来自 df2 的温度,来自 df3 的温度,..,来自df100.

(pandas merge 不起作用,因为我必须计算多个 (99) 成对交叉点)。

【问题讨论】:

  • (我试图改写更简单明了)

标签: python pandas dataframe merge concatenation


【解决方案1】:

你可以尝试在python中使用reduce功能..类似这样的

dfs = [df0, df1, df2, dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on='DateTime'), dfs)

【讨论】:

  • 你能解释一下这是如何通过reduce工作的吗?
  • 内部函数 lambda 只是在给定时间合并两个数据帧.....reduce 需要一个函数和一个list 来处理......它需要从列表中的两个元素有时间可以解决它....以下详细说明python-course.eu/lambda.php.....hope您接受并支持我的回答....
  • 我认为我的问题并不清楚。因此,我将所有温度列合并为一列。正如我在问题编辑中解释的那样,我仍然希望将它们分开。
  • 这将保留每个数据帧中的温度列......结果将是这样的“日期时间”|温度_1 |温度_2 ....| Temperature_n .....是你想要的吗
【解决方案2】:

你可以像这样遍历你的列表:

df_merge = frameList[0]
for df in frameList[1:]:       
    df_merge = pd.merge(df_merge, df, on='DateTime', how='inner')

【讨论】:

    【解决方案3】:

    使用pd.concat,它适用于DataFrames 或Series 列表。

    pd.concat(frameList, axis=1, join='inner')
    

    这比使用pd.merge 更好,因为pd.merge 每次执行时都会成对复制数据。 pd.concat 只复制一次。但是,pd.concat 只能基于轴进行合并,而pd.merge 也可以在(多个)列上进行合并。

    【讨论】:

    • 它在 concat 之后保留乘以“DateTime”列。有没有办法只保留 1 个“日期时间”。
    • 是的,将 DateTime 设为索引,对于每个数据帧:[df.set_index('DateTime', inplace=True) for df in frameList]
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 2016-03-28
    • 2021-10-06
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多