Python 连接具有多个日期的数据帧(Vlookup)
我在下面的一个文件中有以下内容,我想知道如何将它们连接在一起,如果它们是两个独立的数据帧,我知道如何连接,但值范围从D1到D20+,创建这么多的多个数据帧是不实际的。我的目标是根据D1日期加入他们,如下所示Python 连接具有多个日期的数据帧(Vlookup),python,pandas,dataframe,Python,Pandas,Dataframe,我在下面的一个文件中有以下内容,我想知道如何将它们连接在一起,如果它们是两个独立的数据帧,我知道如何连接,但值范围从D1到D20+,创建这么多的多个数据帧是不实际的。我的目标是根据D1日期加入他们,如下所示 D1 D1value D2 D2value D3 D3value 1/2/2018 21.14 1/2/2018 11.14 1/6/2018 1.55 1/3/
D1 D1value D2 D2value D3 D3value
1/2/2018 21.14 1/2/2018 11.14 1/6/2018 1.55
1/3/2018 19.13 1/3/2018 51.14 1/13/2018 2.66
1/6/2018 19.89 1/14/2018 31.14 1/14/2018 3.77
1/13/2018 20.24
1/14/2018 20.91
加入后应该是
D1 D1value D2value D3value
1/2/2018 21.14 11.14 NaN
1/3/2018 19.13 51.14 NaN
1/6/2018 19.89 NaN 1.55
1/13/2018 20.24 NaN 2.66
1/14/2018 20.91 31.14 3.77
有什么建议吗
对于平方答案,添加df:
df = pd.concat([proc(d) for k, d in df.groupby(g, 1)], axis=1)
piRSquared和jp_数据分析答案都有效
问题是我想选择两者作为正确答案 我假设列是成对出现的
def proc(d):
v = d.dropna().values
return pd.Series(v[:, 1], pd.to_datetime(v[:, 0]), name=d.columns[1])
g = np.arange(len(df.columns)) // 2
pd.concat([proc(d) for k, d in df.groupby(g, 1)], axis=1)
D1value D2value D3value
2018-01-02 21.14 11.14 NaN
2018-01-03 19.13 51.14 NaN
2018-01-06 19.89 NaN 1.55
2018-01-13 20.24 NaN 2.66
2018-01-14 20.91 31.14 3.77
设置
我假设您的文件与此完全相同:
D1,D1value,D2,D2value,D3,D3value
1/2/2018,21.14,1/2/2018,11.14,1/6/2018,1.55
1/3/2018,19.13,1/3/2018,51.14,1/13/2018,2.66
1/6/2018,19.89,1/14/2018,31.14,1/14/2018,3.77
1/13/2018,20.24,,,,
1/14/2018,20.91,,,,
我是用中文读的
df = pd.read_csv('test.csv')
这里有一个方法
import pandas as pd
n = 3
# convert date columns from strings to datetimes
df.loc[:, ['D'+str(i) for i in range(1, n+1)]] = \
df.loc[:, ['D'+str(i) for i in range(1, n+1)]].apply(pd.to_datetime)
# create dataframe
df = pd.concat([pd.Series(df.set_index('D'+str(i))['D'+str(i)+'value']).dropna() \
for i in range(1, n+1)], axis=1)
# D1value D2value D3value
# 2018-01-02 21.14 11.14 NaN
# 2018-01-03 19.13 51.14 NaN
# 2018-01-06 19.89 NaN 1.55
# 2018-01-13 20.24 NaN 2.66
# 2018-01-14 20.91 31.14 3.77
您还可以在以下情况下使用连接功能:
df = D1.join(D2.set_index('D2'), on = 'D1', how = 'left')
df = D1.join(D3.set_index('D3'), on = 'D1', how = 'left')
...
现在您可以看到模式并尝试使用循环调用D2、D3。。。为了概括这一点。您是否已经尝试了
pd.concat([d1,d2,d3],axis=1)
了?您好,谢谢您的回复,我正在尝试学习如何使用您的函数,我有:df=pd.read\u csv('C:\\Users\\x\\Desktop\\test.csv')[[您的代码]]打印(df),但df没有更改。请告诉我好吗?@JNg先将文件读入数据帧df
,然后继续使用我编写的代码。它给出了以下错误索引器:索引1超出轴1的大小限制1@JNg恐怕这还不够。用文件的确切内容编辑你的帖子,这样我们就不会有歧义了。让我们来吧。感谢jp_data_分析,这实际上是可行的,但是我的n=3可能对我来说不合适,因为我的df可以扩展,并且可以有一个issue@JNg当然您始终可以通过df.columns
或类似方式检索n
。piR的解决方案也应该可以工作。感谢jp_data_分析,我使用了n=len(df.columns)//2根据您的建议,它工作得很好:D@JnG杰出的如果我们的解决方案有帮助的话,请随意接受(在左边打勾)!我想选择你和piRSquared作为正确答案,我觉得很抱歉只给你们中的一个D