熊猫索引通过具有多个条件的列号匹配多个数据框

时间:2020-05-29 16:48:48

标签: python python-3.x pandas

我正在尝试使用Python在Excel中建立数据索引。我有一个有效的代码,但是效率很低,因为我必须处理一个具有很多不同列名的数据框,并且索引匹配只有几个数据框的数据。

因此,我复制了相同的代码(例如10次),这占用了大量内存。因此,它必须更加高效。因此,我认为使用列号代替名称会更有用,因为所有操作都可以在2个数据帧中完成,而不是将相同的数据帧复制10次以更改列值。

这是我的第一个数据框的样子:

   Name   Location     Date   Open-1  High-1  low-1  close-1 Date     Open High Low Close
1  Orange   Minsk  20200504    NaN    NaN     NaN     NaN   20200505  NaN  NaN  NaN  NaN  
2  Steak   Dallas  20200505    NaN    NaN     NaN     NaN   20200506  NaN  NaN  NaN  NaN

NaN值应填充如下所示的数据帧中的数据:

    Name      Date      Time  Open  High   Low  Close  Volume  VWAP  Trades
0   Orange  20200504  15:30:00  3.70  3.97  3.65   3.75    1000  3.60      55
1   Orange  20200504  17:00:00  3.65  3.95  3.50   3.80    1200  3.65      68
2   Orange  20200504  20:00:00  3.50  3.83  3.44   3.60    1300  3.73      71
3   Orange  20200504  22:00:00  3.55  3.58  3.35   3.57    1400  3.78      81
4   Orange  20200505  15:30:00  3.50  3.85  3.45   3.70    1500  3.73      95
5   Orange  20200505  17:00:00  3.65  3.70  3.50   3.60    1600  3.65      54
6   Orange  20200505  20:00:00  3.80  3.85  3.45   3.81    1700  3.73      41
7   Orange  20200505  22:00:00  3.60  3.84  3.45   3.65    1800  3.75      62
0   Steak   20200505  10:00:00  8.70  8.97  8.65   8.75    1000  8.60      55
1   Steak   20200505  12:00:00  8.65  8.95  8.50   8.80    1200  8.65      68
2   Steak   20200505  14:00:00  8.50  8.83  8.44   8.60    1300  8.73      71
3   Steak   20200505  16:00:00  8.55  8.58  8.35   8.57    1400  8.78      81
4   Steak   20200506  10:00:00  8.50  8.85  8.45   8.70    1500  8.73      95
5   Steak   20200506  12:00:00  8.65  8.70  8.50   8.60    1600  8.65      54
6   Steak   20200506  14:00:00  8.80  8.85  8.45   8.81    1700  8.73      41
7   Steak   20200506  16:00:00  8.60  8.84  8.45   8.65    1800  8.75      62

如您所见,第二个数据框中的列仅具有值“ Open”,“ High”等。而第一个数据帧中也具有名为“ Open-1”,“ High-1”的列名称,等

我当前用于索引/匹配数据的代码是:

rdf13 = rdf12.groupby(['Name','Date']).agg(Open=('Open','first'),High=('High','max'),Low=('Low','min'), Close=('Close','last'),Volume=('Volume','sum'),VWAP=('VWAP','mean'),Trades=('Trades','sum')).reset_index()
result11 = pd.merge(rdf13, rdf11, how='inner', on=['Name', 'Date']).iloc[:,:-4].dropna(1).rename(columns = {"Open_x": "Open", "High_x": "High", "Low_x": "Low", "Close_x": "Close", "Volume_x": "Volume", "VWAP_x": "VWAP", "Trades_x": "Trades"})
result12 = result11.reindex(index=result11.index[::-1])
result13 = result12[['Name', 'Location', 'Date', 'Check_2','Open', 'High', 'Low', 'Close', 'Volume', 'VWAP', 'Trades']].reset_index()

readfile11 = pd.read_excel("Trackers\TEST Tracker.xlsx")

readfile11['Count'] = np.arange(len(readfile11))
df11 = readfile11.set_index(['Name', 'Location', 'Date'])
df12 = result13.set_index(['Name', 'Location', 'Date'])

fdf11 = df12.combine_first(df11).reset_index().reindex(readfile11.columns, axis=1).sort_values('Count').drop_duplicates()

但是为了使该代码将数据索引到“ -1”列,必须将其复制,并且名称需要更改。我发现使用列号代替名称可能会更有效。

所需的输出是:

   Name   Location     Date   Open-1  High-1  low-1  close-1    Date     Open High Low Close
1  Orange   Minsk  20200504    3.7    3.97     3.35     3.57   20200505  3.5  3.85  3.45  3.65  
2  Steak   Dallas  20200505    8.7    8.97     8.35     8.57   20200506  8.5  8.85  8.45  8.45

0 个答案:

没有答案