熊猫4列出了比较

时间:2017-08-11 11:43:58

标签: python pandas csv

我在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

2 个答案:

答案 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