gpt4 book ai didi

python - Pandas 子集将不同的结果返回给 numpy

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

我正在尝试使用两个条件对 pandas dataframe 进行子集化。但是,我没有得到与使用 numpy 时相同的结果。我做错了什么?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(20,120,101)
y = np.linspace(-45,25,101)

xs,ys = np.meshgrid(x,y)

idx = (xs >=100) & (ys >= 0)

plt.scatter(xs,ys,s=2,c='b')
plt.scatter(xs[idx],ys[idx],s=2,c='r')

enter image description here

我需要从我的数据集中删除红色 block ,我可以通过使用 numpy 来完成:

plt.scatter(xs[~idx],ys[~idx],s=2,c='b')

enter image description here

如何使用 pandas dataframe 复制它?

我尝试使用与上面相同的逻辑:

data = {'x':x,'y':y}
df = pd.DataFrame(data)

mask = (df.x >=100) & (df.y >= 0)
df2 = df[~mask]

我也尝试过使用 loc:

df.loc[(df.x >=100) & (df.y >= 0),['x','y']] = np.nan

这两种方法都会产生以下结果:

enter image description here

如何复制 numpy 的结果?

非常感谢。

最佳答案

您不会获得相同的结果,因为您没有在将坐标传递给 pandas 之前创建所有坐标。这是一个快速解决方案:

data = {'x':xs.flatten(),'y':ys.flatten()}
df = pd.DataFrame(data)
mask = (df.x >=100) & (df.y >= 0)
df2 = df[~mask]
plt.scatter(df2.x,df2.y,s=2,c='b')

将您的数组展平并 reshape 为只有一个维度,以便它们可用于构建包含几个坐标而不是列表的 DF。

输出:

Output

编辑:结果相同,但数据框包含 x 和 y
  1. 将 df 分成 block
data_x = np.linspace(20,120,101)
data_y = np.linspace(-45,25,101)
dataframe = pd.DataFrame({'x':data_x,'y':data_y})
chunk_size = 25
dfs = [dataframe[i:i+chunk_size] for i in range(0,dataframe.shape[0],chunk_size)]
  1. 定义将为您提供您感兴趣的点的函数。两个循环,因为您需要获取 x 和 y 值的每个配置
def generatorPoints(dfs):
for i in range(len(dfs)):
x = dfs[i].x
for j in range(len(dfs)):
y = dfs[j].y
xs, ys = np.meshgrid(x,y)
idx = (xs >=100) & (ys >= 0)
yield xs[~idx], ys[~idx]

x, y = [], []
for xs, ys in generatorPoints(dfs):
x.extend(xs), y.extend(ys)

plt.scatter(x,y,s=2,c='b')

这给出了与前面代码相同的结果。肯定有地方可以进行一些优化,但这是您请求的开始:)。

关于python - Pandas 子集将不同的结果返回给 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569313/

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