gpt4 book ai didi

python - 处理数据帧列中大量不同值的总和

转载 作者:行者123 更新时间:2023-12-01 08:15:28 27 4
gpt4 key购买 nike

Python 新手,使用 Python 进入数据分析世界。我正在处理练习数据,其中一列有 87 个不同值,另一列有 888 个不同值,我正在考虑删除后一列。我只是不明白如何处理这些列。我是对这些列进行分组还是删除这些列。如果我组队的话我该怎么办!?真的很欣赏你的想法。 @托比·佩蒂@Vaishali

例如:

import pandas as pd
import bumpy as np

print("Count of distinct entries for car:", len(set(car_sales['car'])))<br/>
print("Distinct entries for car:", set(car_sales['car']))

Count of distinct entries for car: 87
Distinct entries for car: {'Lamborghini', 'ËUAZ', 'Daewoo', 'Jeep', 'Ferrari', 'Bentley', 'Mercury', 'MINI', 'Acura', 'Land Rover', 'Aston Martin', 'Fisker', 'Dodge', 'Fiat', 'MG', 'Samsung', 'Rolls-Royce', 'SsangYong', 'Hyundai', 'Lincoln', 'Ford', 'Moskvich-Izh', 'Samand', 'Audi', 'Dadi', 'Geely', 'Dacia', 'Daihatsu', 'Maserati', 'Volkswagen', 'Peugeot', 'Volvo', 'Nissan', 'SMA', 'Hummer', 'Porsche', 'Subaru', 'Alfa Romeo', 'Saab', 'Buick', 'Mazda', 'Mercedes-Benz', 'Lexus', 'Hafei', 'Renault', 'Suzuki', 'Chrysler', 'BYD', 'Moskvich-AZLK', 'Jaguar', 'Smart', 'ZAZ', 'Groz', 'Infiniti', 'TATA', 'Lifan', 'ZX', 'Isuzu', 'Rover', 'Honda', 'Mitsubishi', 'Cadillac', 'FAW', 'Aro', 'Wartburg', 'GMC', 'Great Wall', 'Lancia', 'Bogdan', 'Kia', 'BMW', 'JAC', 'Tesla', 'Seat', 'Barkas', 'VAZ', 'Huanghai', 'Toyota', 'Citroen', 'Other-Retro', 'Chery', 'Opel', 'Chevrolet', 'Skoda', 'UAZ', 'Changan', 'GAZ'}

最佳答案

你的问题到底是什么?

更新:经过一些澄清/猜测,我假设这个问题涉及两个问题:

  1. 如何将groupby限制为仅前k组(通过选择的某种聚合)。
  2. 如何汇总列,包括一些非数字列。

对于初学者来说,sns 包含一些漂亮的数据集,对于此类问题非常方便,例如,下面我们将使用“mpg”,其中包含一些汽车和里程信息。

import pandas as pd
import numpy as np
import seaborn as sns

df = sns.load_dataset('mpg')

我们将把提供的名称拆分为品牌型号:

df[['brand', 'model']] = pd.DataFrame(df.name.str.split(' ', n=1).values.tolist())
df.head(3)

Out[]:
mpg cylinders displacement horsepower weight acceleration \
0 18.0 8 307.0 130.0 3504 12.0
1 15.0 8 350.0 165.0 3693 11.5
2 18.0 8 318.0 150.0 3436 11.0

model_year origin name brand model
0 70 usa chevrolet chevelle malibu chevrolet chevelle malibu
1 70 usa buick skylark 320 buick skylark 320
2 70 usa plymouth satellite plymouth satellite

稍后,我们将添加一列 n,我们将用它来计算我们的统计数据有多少条目:

df['n'] = 1

根据最大加速度查找前 5 个组(OP 希望使用总销售额,因此在他的情况下,我们将使用 sales.sum() 而不是acceleration.max(),但这里我们没有销售数据)。要点是建立我们想要报告的组的索引(并将其他组重命名为“其他”)。我们将该索引(称为 idx)转换为元组列表,以便更轻松地进行子集设置。

idx = df.groupby(['brand', 'model']).acceleration.max().sort_values(ascending=False).head(5).index.to_list()
idx

Out[]:
[('peugeot', '504'),
('vw', 'pickup'),
('vw', 'dasher (diesel)'),
('volkswagen', 'type 3'),
('chevrolet', 'chevette')]

现在构建一个 bool 选择器 top10,对于所选组来说,它的值为 True

top10 = df.set_index(['brand', 'model']).index.isin(idx)

重命名其他:

df.loc[~top10, 'brand'] = 'Other'
df.loc[~top10, 'model'] = ''

现在,对于非数字列,我们选择报告多数值(组内最常见的值)。

from collections import Counter
def majority(*args):
return Counter(*args).most_common(1)[0][0]

# example
majority('z a b a a c d'.split())

Out[]:
'a'

最后,我们定义一个用于各个列的聚合器字典:

# numeric: use mean
desired = {k:'mean' for k in df.columns if np.issubdtype(df[k], np.number)}
# simplified:
desired = {k:'mean' for k in ['mpg', 'horsepower', 'weight']}

# non-numeric: use majority
desired.update({'origin': majority})

# also report the size of each group
desired.update({'n': 'sum'})

现在,进行分组和聚合:

df.groupby(['brand', 'model']).agg(desired)

Out[]:
mpg horsepower weight origin n
brand model
Other 23.340052 105.540682 2984.651163 usa 387
chevrolet chevette 30.400000 63.250000 2090.250000 usa 4
peugeot 504 23.550000 83.500000 3022.250000 europe 4
volkswagen type 3 23.000000 54.000000 2254.000000 europe 1
vw dasher (diesel) 43.400000 48.000000 2335.000000 europe 1
pickup 44.000000 52.000000 2130.000000 europe 1

关于python - 处理数据帧列中大量不同值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com