我在python中很新,有以下问题。我有一个有4列的csv文件。我通过读取csv文件将数据转换为数据帧。我想比较日期1和日期2,并从date2填充date1中的缺失值。此外,还有值2到值1的值。
我有一个csv文件,如下所示:
Date 1;Values 1;Date 2;Values 2
07.08.2017;-0,52;07.08.2017;-0,52
04.08.2017;-1,30;04.08.2017;-1,3
03.08.2017;-0,40;03.08.2017;-0,3995
02.08.2017;-0,43;02.08.2017;-0,4285
01.08.2017;-0,46;01.08.2017;-0,46
31.07.2017;-0,48;31.07.2017;-0,3625
27.07.2017;-0,42;28.07.2017;-1,25
26.07.2017;-0,42;27.07.2017;-0,41
25.07.2017;-0,41;26.07.2017;-0,415
24.07.2017;-0,40;25.07.2017;-0,4085
21.07.2017;-1,31;24.07.2017;-0,4
我尝试编码如下但不成功,我收到错误消息:
KeyError:'Date 1'
代码如下所示:
import numpy as np
import pandas as pd
csv_loader = pd.read_csv('File1.csv', encoding='cp1252', sep=';', index_col=0).dropna()
csv_loader.reset_index()
print(csv_loader)
print("-----------------------------------------------")
test = set(csv_loader["Date 1"]).intersection(csv_loader["Date 2"])
输出应如下所示:
Date 1 Values 1 Date 2 Values 2
07.08.2017 -0,52 07.08.2017 -0,52
04.08.2017 -1,30 04.08.2017 -1,3
03.08.2017 -0,40 03.08.2017 -0,3995
02.08.2017 -0,43 02.08.2017 -0,4285
01.08.2017 -0,46 01.08.2017 -0,46
31.07.2017 -0,48 31.07.2017 -0,3625
28.07.2017 -1,25 28.07.2017 -1,25
27.07.2017 -0,41 27.07.2017 -0,41
26.07.2017 -0,42 26.07.2017 -0,415
25.07.2017 -0,41 25.07.2017 -0,4085
24.07.2017 -0,40 24.07.2017 -0,4
21.07.2017 -1,31 21.07.2017 -1,31
答案 0 :(得分:2)
您可以通过执行outer-merge来接近所需的结果。然后使用AMC's idea,调用combine_first
填写缺失的数据:
import pandas as pd
csv_loader = pd.read_csv('File1.csv', encoding='cp1252', sep=';')
df1 = csv_loader[['Date 1', 'Values 1']]
df2 = csv_loader[['Date 2', 'Values 2']]
result = pd.merge(df1, df2, left_on='Date 1', right_on='Date 2', how='outer')
mask = pd.isnull(result[['Date 1', 'Date 2']])
for col in ['Date', 'Values']:
a, b = '{} 1'.format(col), '{} 2'.format(col)
result[a] = result[a].combine_first(result[b])
result[b] = result[b].combine_first(result[a])
print(result)
missing = {col:result.loc[mask[col], col] for col in mask}
for col in missing:
print('missing from {}:\n{}'.format(col, missing[col]))
产量
Date 1 Values 1 Date 2 Values 2
0 07.08.2017 -0,52 07.08.2017 -0,52
1 04.08.2017 -1,30 04.08.2017 -1,3
2 03.08.2017 -0,40 03.08.2017 -0,3995
3 02.08.2017 -0,43 02.08.2017 -0,4285
4 01.08.2017 -0,46 01.08.2017 -0,46
5 31.07.2017 -0,48 31.07.2017 -0,3625
6 27.07.2017 -0,42 27.07.2017 -0,41
7 26.07.2017 -0,42 26.07.2017 -0,415
8 25.07.2017 -0,41 25.07.2017 -0,4085
9 24.07.2017 -0,40 24.07.2017 -0,4
10 21.07.2017 -1,31 21.07.2017 -1,31
11 28.07.2017 -1,25 28.07.2017 -1,25
missing from Date 2:
10 21.07.2017
Name: Date 2, dtype: object
missing from Date 1:
11 28.07.2017
Name: Date 1, dtype: object
请注意index_col=0
会导致read_csv
将第一列作为索引。
因此Date 1
成为索引的名称,而不是DataFrame的列。
请注意Date 1
如何单独出现在列名称下面的一行:
In [67]: csv_loader
Out[67]:
Values 1 Date 2 Values 2
Date 1
07.08.2017 -0,52 07.08.2017 -0,52
04.08.2017 -1,30 04.08.2017 -1,3
...
要将Date 1
作为列,请删除index_col=0
。
答案 1 :(得分:1)
您需要删除的另一件事是dropna()函数。目前,您要删除所有空白行。
然后,你可以使用它:
csv_loader["combined_date"] = csv_loader["Date 1"].combine_first(csv_loader["Date 2"])
这将创建一个新列combined_date,其中包含日期1中的所有值,日期2中的任何值都将从日期1输入到空白中。
我不知道你的df是如何用空白的,但是像这样:
Date 1 Date 2 combined_date
08.08.2017 08.17.2017 08.08.2017
nan 02.02.2017 02.02.2017