【问题标题】:Matching columns in data set with its class, similar to VLOOKUP将数据集中的列与其类匹配,类似于 VLOOKUP
【发布时间】:2019-07-02 04:15:06
【问题描述】:

我有一个大数据集,它的头部如下所示:

          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 文件,其中说明 company 在哪个 class 中,如下所示:

     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

编辑1:

       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]

【问题讨论】:

  • 抱歉,您在第一行的结果数据框中,283 228 230 代表的数字是什么?
  • 它们分别是A,B,C中所有数据的总和。例如。 230 = company 3 + company 7 + company 12
  • 我想我明白了。请检查我是否在我给出的答案中正确理解了工作流程。
  • 好的,我去看看

标签: python pandas numpy merge melt


【解决方案1】:

您需要执行四个不同的操作才能达到您想要的状态。看来您正在使用 pandas,所以我将概述使用 pandas 的解决方案。

  1. 融化大型数据框。这使您可以以类似于在 excel 中使用数据透视表的方式将列转换为行。

Pandas Melt Function

  1. 合并大数据框(将其设为左侧)与小数据框(将其设为右侧)。这是一个更强大的 vlookup 版本。您想使用 timeclassleft join

Pandas Merging 101

  1. 聚合您的合并结果并按时间分组。我假设您想求和,但您可以执行许多其他聚合函数,例如计数、最小值、最大值。查看 pandas 文档了解更多详情。

Pandas group-by and sum

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

  1. 透视数据到您想要的结果形状。枢轴是 melt 的反面。随着融化,我们将列转换为行。通过pivot,我们将行变成列,

How to pivot a dataframe

这是一个按逻辑步骤编写的代码 sn-p,不是为了获得最佳性能。希望您可以逐步完成每个步骤以更好地理解。请注意,我将标题放在 csv 文件中,因此您可能需要根据导入数据的方式在数据框中声明列名。

largeCsv 标头: Time,Company1,Company2,Company3,Company4,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')

【讨论】:

  • 好的,我试试看
  • 第二步合并时得到KeyError: 'Time' 我想这是因为类数据中没有时间列,对吗?
  • 这是我为 step1 所做的:import pandas as pd data = pd.read_csv("data.csv") data = pd.melt(data, id_vars=['Time'])
  • 对不起,我以为我在小数据框中看到了时间。给我几分钟,我会发布代码。 ;)
  • 谢谢!你在 csv 文件中放了哪些标题?
【解决方案2】:

以下是可用于运行代码的可重现数据集。

代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多