gpt4 book ai didi

python - 通过对 pandas 进行采样,用不同的元素填充数据框中的空值

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:40 25 4
gpt4 key购买 nike

我创建了一个数据框'Pclass'

    class   deck    weight
0 3 C 0.367568
1 3 B 0.259459
2 3 D 0.156757
3 3 E 0.140541
4 3 A 0.070270
5 3 T 0.005405

我的初始数据框'df'看起来像

  class deck
0 3 NaN
1 1 C
2 3 NaN
3 1 C
4 3 NaN
5 3 NaN
6 1 E
7 3 NaN
8 3 NaN
9 2 NaN
10 3 G
11 1 C

我想通过从 df 中选择一个样本来填充 df 中的空甲板值Pclass 根据权重给出的牌组。

我只成功编写了采样过程的代码。

np.random.choice(a=Pclass.deck,p=Pclass.weight)

我在实现填充空值的方法时遇到了麻烦,方法是查找属于第 3 类的空行并为每个行选择一个随机牌组值(并非始终是相同的值),所以 fillna('只有一个')。

注意:我有另一个与此类似的问题,但更广泛地使用 groupby 对象以及最大限度地提高效率,但我没有得到任何答复。任何帮助将不胜感激!

编辑:向数据框 Pclass 添加行

1       F             0.470588
1 E 0.294118
1 D 0.235294
2 F 0.461538
2 G 0.307692
2 E 0.230769

最佳答案

这会从 Pclass 数据帧的 deck 列中生成随机选择,并将它们分配给 deck 中的 df 数据帧 列(生成所需的数字)。如果您想在类变量的不同值之间执行此操作,可以将这些命令放入列表理解中。我建议避免使用 class 作为变量名,因为它用于定义新的 classes在 Python 中。

import numpy as np
import pandas as pd

# Generate data and normalised weights
normweights = np.random.rand(6)
normweights /= normweights.sum()

Pclass = pd.DataFrame({
"cla": [3, 3, 3, 3, 3, 3],
"deck": ["C", "B", "D", "E", "A", "T"],
"weight": normweights
})

df = pd.DataFrame({
"cla": [3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1],
"deck": [np.nan, "C", np.nan, "C",
np.nan, np.nan, "E", np.nan,
np.nan, np.nan, "G", "C"]
})

# Find missing locations
missing_locs = np.where(df.deck.isnull() & (df.cla == 3))[0]

# Generate new values
new_vals = np.random.choice(a = Pclass.deck.values,
p = Pclass.weight.values, size = len(missing_locs))

# Assign the new values to the dataframe
df.set_value(missing_locs, 'deck', new_vals)
<小时/>

针对分类变量的多个级别运行

如果您想在类变量的所有级别上运行此操作,您需要确保选择 Pclass 中的数据子集(仅是感兴趣的类)。人们可以使用列表理解来查找“类”每个级别的缺失数据(我已经更新了下面的模拟数据)...

# Find missing locations
missing_locs = [np.where(df.deck.isnull() & (df.cla == i))[0] for i in [1,2,3]]

但是,我认为如果代码在循环中会更容易阅读:

# Generate data and normalised weights
normweights3 = np.random.rand(6)
normweights3 /= normweights3.sum()

normweights2 = np.random.rand(3)
normweights2 /= normweights2.sum()

Pclass = pd.DataFrame({
"cla": [3, 3, 3, 3, 3, 3, 2, 2, 2],
"deck": ["C", "B", "D", "E", "A", "T", "X", "Y", "Z"],
"weight": np.concatenate((normweights3, normweights2))
})

df = pd.DataFrame({
"cla": [3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1],
"deck": [np.nan, "C", np.nan, "C",
np.nan, np.nan, "E", np.nan,
np.nan, np.nan, "G", "C"]
})

class_levels = [1, 2, 3]
for i in class_levels:

missing_locs = np.where(df.deck.isnull() & (df.cla == i))[0]

if len(missing_locs) > 0:
subset = Pclass[Pclass.cla == i]

# Generate new values
new_vals = np.random.choice(a = subset.deck.values,
p = subset.weight.values, size = len(missing_locs))

# Assign the new values to the dataframe
df.set_value(missing_locs, 'deck', new_vals)

关于python - 通过对 pandas 进行采样,用不同的元素填充数据框中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404874/

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