在Python中连接多个日期列和列值

在Python中连接多个日期列和列值,python,pandas,Python,Pandas,实际的.CSV数据文件 一个可重复的例子: df = pd.DataFrame({'Date': pd.date_range('01/03/11',periods=8, format=' %d/%m/%y %p'), 'MTM1': [2, 3, 4, 5, 6, 7, 8, 9], 'Date1': pd.date_range('01/07/11',periods=8, format=' %d/%m/%y

实际的.CSV数据文件

一个可重复的例子:

df = pd.DataFrame({'Date': pd.date_range('01/03/11',periods=8, format=' %d/%m/%y    %p'),
                    'MTM1': [2, 3, 4, 5, 6, 7, 8, 9],
                    'Date1': pd.date_range('01/07/11',periods=8, format=' %d/%m/%y    %p'),
                    'MTM2': [4, 3, 5, -7, 6, -9, 8, 9]
                    })

我有一个以上格式的.csv文件,我想连接所有日期列,并根据各自的日期索引保留MTM列值,并去掉其余的日期列,为所有MTM创建一个日期索引。

考虑将数据帧按日期/MTM对拆分为数据帧列表,然后使用
reduce()链接合并外部联接。


您好,谢谢您的提示,实际上我正在阅读DF的列表,然后在添加列表后运行concat,这是不需要的,正如您通过合并lest本身所建议的。很高兴听到解决方案有效!如果有帮助,请在旁边打勾确认解决方案。您好,谢谢您的努力,这里我忘了再提一点,即这些对的长度是可变的,因此这里由于长度可变且对的数量较多,它正在合并,但也会给出其他行,结尾有不匹配的日期。我们可以将连接从外部更改为内部。那么您想在所有数据帧中保留具有MTM的行吗?没有一个NaN?好吧,我的错误解决了,排序函数有问题,谢谢
df = pd.DataFrame({'Date': pd.date_range('01/03/11',periods=8, format=' %d/%m/%y    %p'),
                    'MTM1': [2, 3, 4, 5, 6, 7, 8, 9],
                    'Date1': pd.date_range('01/07/11',periods=8, format=' %d/%m/%y    %p'),
                    'MTM2': [4, 3, 5, -7, 6, -9, 8, 9]
                    })
from functools import reduce
import pandas as pd

df = pd.DataFrame({'Date': pd.date_range('01/03/11',periods=8, format=' %d/%m/%y'),
                   'MTM1': [2, 3, 4, 5, 6, 7, 8, 9],
                   'Date1': pd.date_range('01/07/11',periods=8, format=' %d/%m/%y'),
                   'MTM2': [4, 3, 5, -7, 6, -9, 8, 9]
                  })

# FOR POSTED TWO PAIRING DATA
dfList = [df[['Date', 'MTM1']],
          df[['Date1','MTM2']].rename(columns={'Date1':'Date'})]

# FOR MANY PAIRINGS (ASSUMING ORDER AND MATCHES INTACT)
dfList = [df[[d, m]].rename(columns={d:'Date'})\
                        for d, m in zip([c for c in df.columns if 'Date' in c],
                                        [c for c in df.columns if 'MTM' in c])]

df = reduce(lambda left, right: pd.merge(left, right, on=['Date'], how='outer'), dfList).set_index('Date')
print(df)

#             MTM1  MTM2
# Date                  
# 2011-01-03   2.0   NaN
# 2011-01-04   3.0   NaN
# 2011-01-05   4.0   NaN
# 2011-01-06   5.0   NaN
# 2011-01-07   6.0   4.0
# 2011-01-08   7.0   3.0
# 2011-01-09   8.0   5.0
# 2011-01-10   9.0  -7.0
# 2011-01-11   NaN   6.0
# 2011-01-12   NaN  -9.0
# 2011-01-13   NaN   8.0
# 2011-01-14   NaN   9.0