数据与同级车设置匹配列,类似VLOOKUP

问题描述 投票:0回答:2

我有一个大的数据集,其中它的头部看起来像这样:

          Time  Company 1  Company 2  ...  Company 12  Company 13  Company 14
0    1/01/2015         49         19  ...          80          56          61
1    2/01/2015          2         92  ...          28          98          72
2    3/01/2015         39         69  ...          93          10          66
3    4/01/2015         31         54  ...          78           9          84
4    5/01/2015         37         81  ...          59          32          99
5    6/01/2015         83         69  ...          67          12          69
6    7/01/2015         38          7  ...          37          50          22
7    8/01/2015         75         90  ...          29          99          90
8    9/01/2015          2          7  ...           4          84          59
9   10/01/2015         14         66  ...          40          51          78
10  11/01/2015         20         87  ...           7          26          52
11  12/01/2015         33         84  ...          80          81          69
12  13/01/2015         93         90  ...           4          55          65
13  14/01/2015         95         47  ...          16          43          75
14  15/01/2015         71         66  ...          53          36           0
15  16/01/2015         98         26  ...          41          48          31
16  17/01/2015         29         29  ...           3          13           9
17  18/01/2015         46         96  ...          99          52          71
18  19/01/2015         27         91  ...          50          65          21
19  20/01/2015         45         64  ...          24          97          87

[20 rows x 15 columns]

这是一个CSV文件,然后我有一个单独的csv文件,说这是companyclass,就像这样:

     Company1  B
0    Company2  B
1    Company3  C
2    Company4  A
3    Company5  A
4    Company6  A
5    Company7  C
6    Company8  B
7    Company9  A
8   Company10  A
9   Company11  B
10  Company12  C
11  Company13  A
12  Company14  C

我想摆脱company1,...,company14,而是只列A,B,C列。我知道如何用一个简单的VLOOKUP功能做到这一点在Excel中,但是我的数据集是非常大的,因此在Excel中使用VLOOKUP是不可行的。

有什么办法,我可以使用Python实现我想要的结果?

这里是我想要的输出是这样的:

          Time    A    B    C
0    1/01/2015  283  228  230
1    2/01/2015  303  158  224
2    3/01/2015  243  163  277
3    4/01/2015  306  259  250
4    5/01/2015  257  232  242
5    6/01/2015  258  160  288
6    7/01/2015  406  136  170
7    8/01/2015  407  180  239
8    9/01/2015  283   98  127
9   10/01/2015  321  144  248
10  11/01/2015  344  296  212
11  12/01/2015  372  175  243
12  13/01/2015  133  249  181
13  14/01/2015  251  245  214
14  15/01/2015  227  263  226
15  16/01/2015  344  154  180
16  17/01/2015  361  146  124
17  18/01/2015  337  290  245
18  19/01/2015  252  247  212
19  20/01/2015  315  169  219

EDIT1

       Company1  B
0      Company2  B
1      Company3  C
2      Company4  A
3      Company5  A
4      Company6  A
5      Company7  C
6      Company8  B
7      Company9  A
8     Company10  A
9     Company11  B
10    Company12  C
11    Company13  A
12    Company14  C
13    Company15  B
14    Company16  B
15    Company17  C
16    Company18  A
17    Company19  A
18    Company20  A
19    Company21  C
20    Company22  B
21    Company23  A
22    Company24  A
23    Company25  B
24    Company26  C
25    Company27  A
26    Company28  C
27    Company29  B
28    Company30  B
29    Company31  C
..          ... ..
301  Company303  A
302  Company304  A
303  Company305  B
304  Company306  C
305  Company307  A
306  Company308  C
307  Company309  B
308  Company310  B
309  Company311  C
310  Company312  A
311  Company313  A
312  Company314  A
313  Company315  C
314  Company316  B
315  Company317  A
316  Company318  A
317  Company319  B
318  Company320  C
319  Company321  A
320  Company322  C
321  Company323  B
322  Company324  B
323  Company325  C
324  Company326  A
325  Company327  A
326  Company328  A
327  Company329  C
328  Company330  B
329  Company331  A
330  Company332  A

[331 rows x 2 columns]
python pandas numpy merge melt
2个回答
1
投票

你需要做四个不同的操作以获得您想要的状态。它看起来像您使用的熊猫,所以我将概述用大熊猫的解决方案。

  1. 熔化的大数据帧。这可以让你把列到行中,你可以使用Excel数据透视表类似的方式。

Pandas Melt Function

  1. 合并的大数据帧(使这个左)与小数据框(让这个正确的)。这是VLOOKUP的更强大的版本。你想使用左连接是在时间和类。

Pandas Merging 101

  1. 聚合来自您的合并和按时间分组的结果。我假设你要总结,但你可以做很多其他聚合功能,如计数,最小值,最大值。检查大熊猫文档了解更多信息。

Pandas group-by and sum

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sum.html

  1. 枢转数据到所需的结果的形状。枢轴是熔体的对面。当熔体我们换位列转换为行。有了支点,我们正在转向行转换成列,

How to pivot a dataframe

下面是写在逻辑步骤,而不是最佳性能的代码片段。希望的是,你可以通过更好地理解每一步走。请注意,我把标题的CSV文件,因此你可能需要在您的数据帧取决于你如何导入数据申报列名。

largeCsv头:时间,公司1,Company2的,公司3,公司4,Company5

smallCsv头:姓名,班级

import pandas as pd

dfSmall = pd.read_csv('c:/temp/smallCsv.csv')

dfLarge = pd.read_csv('c:/temp/largeCsv.csv')

dfMeltedLarge = pd.melt(dfLarge, id_vars=['Time'], var_name='name')

dfMerged = dfMeltedLarge.merge(dfSmall, on='name', how='left')[['Time', 'class', 'value']]

dfSum = dfMerged.groupby(['Time', 'class']).sum()

dfResult = dfSum.pivot_table(index='Time', columns='class', values='value')

1
投票

以下是可重复的数据集,你可以运行的代码。

编码:

import pandas as pd
pd.options.display.max_columns = 10

headers = [
    'Time',
    'Company1',
    'Company2',
    'Company3',
    'Company4',
    'Company5',
    'Company6',
]
records = [
    ('1/01/2015', 10, 20, 30, 40, 50, 60),
    ('2/01/2015', 100, 200, 300, 400, 500, 600),
    ('3/01/2015', 1000, 2000, 3000, 4000, 5000, 6000),
]

data = pd.DataFrame.from_records(records, columns=headers)

mapper = pd.DataFrame(
    [
        ('Company1', 'A'),
        ('Company2', 'A'),
        ('Company3', 'B'),
        ('Company4', 'B'),
        ('Company5', 'C'),
        ('Company6', 'C'),
    ],
    columns=['Company', 'Class'],
)
for col_name in ['A', 'B', 'C']:
    class_companies_group = mapper[mapper['Class'] == col_name]['Company'].values
    data[col_name] = data[class_companies_group].sum(axis=1)

result = data[['Time', 'A', 'B', 'C']]
print(result)

输出结果:

        Time     A     B      C
0  1/01/2015    30    70    110
1  2/01/2015   300   700   1100
2  3/01/2015  3000  7000  11000
© www.soinside.com 2019 - 2024. All rights reserved.