Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接具有多个日期的数据帧(Vlookup)_Python_Pandas_Dataframe - Fatal编程技术网

Python 连接具有多个日期的数据帧(Vlookup)

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到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/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