Python 过滤阵列中的数据并在轴1中保持相同的形状

Python 过滤阵列中的数据并在轴1中保持相同的形状,python,pandas,numpy,Python,Pandas,Numpy,我试图使用pandas和numpy获得给定数据帧的一些特定值 我现在的过程如下: 在[1]中:df=pd.read\u csv(文件) 在[2]中:a=df[df.columns[1]].值 现在,a具有以下形状: 在[3]:a.形状 Out[4]:(8640,1) 当我过滤它以获得与给定条件匹配的值时,我在轴1中没有得到相同的形状: 在[5]中:b=a[a>100] 在[6]:b.形状 Out[7]:(3834,) 现在,每次过滤新阵列时,我都在重塑它们,但这会让我的代码看起来非常混乱和不舒服

我试图使用pandas和numpy获得给定数据帧的一些特定值

我现在的过程如下:

在[1]中:df=pd.read\u csv(文件)

在[2]中:a=df[df.columns[1]].值

现在,a具有以下形状:

在[3]:a.形状

Out[4]:(8640,1)

当我过滤它以获得与给定条件匹配的值时,我在轴1中没有得到相同的形状:

在[5]中:b=a[a>100]

在[6]:b.形状

Out[7]:(3834,)

现在,每次过滤新阵列时,我都在重塑它们,但这会让我的代码看起来非常混乱和不舒服:

在[8]中:(b.重塑(b.尺寸,1)).形状

Out[9]:(3834,1)

我真的需要它有形状(x,1),以便使用其他一些函数,那么它是否有任何方法可以在每次我过滤掉值时获得该形状,而不必不断地重塑它

编辑:

我需要进行这种整形的主要原因是,对于具有相同行数的两个数组,我需要获得每行中的最小值。我使用的是np.min和np.concatenate。 例如: av是我的数据帧中5个不同列的平均值:

x[x>0.3]
    a
0   0.382530
1   NaN
2   0.568910
3   0.452816
4   0.884955
5   0.944797
6   0.379389
av=np.平均值(菌柱,轴=1)

它有形状(8640,) med是相同列的中间值:

med=np.中位数(菌落,轴=1)

当我尝试获取最小值时,我有下一个错误:

np.min(np.concatenate((av,med),axis=1),axis=1)回溯(最近 最后一次通话):

文件“”,第1行,在 np.min(np.concatenate((av,med),轴=1,轴=1)

AxisError:轴1超出维度为1的数组的界限

但是,如果我重塑av和med,效果会很好:

np.min(np.concatenate((平均整形(平均大小,1),中间整形(平均大小,1)),轴=1,轴=1) Out[232]:数组([0,0,0.,…,0,0,0,0.]))


您可以使用
np.take(a,np.where(a>100)[0],axis=0)
来保持与原始形状相同的形状

如果您确实需要此形状,此代码将提供形状
(…,1)
,并且它没有那么难看:


如果您的代码不太重,您必须使用
numpy
来提高性能,那么您可以使用
pandas
对象(数据帧/系列)并保持形状

例如,以df为例(我必须补充,您应该提供您的问题):

要创建形状为
(7,1)
的对象,可以使用
x=df[['a']]
,这是一个有一列的数据帧(与
x=df['a']
相比,后者是一个形状为
(7,)
的系列)

现在,如果我通过使用
y=x.values
转到numpy数组,我仍然得到相同的形状(x和y都有形状(7,1))

但是,两者对布尔索引的反应都不同:调用
y[y>0.3]
将返回一个具有形状(6,)的数组,而调用
x[x>0.3]
将返回。。。具有形状(7,1)的数据帧。让我们看看:

数组:

y[y>0.3]
array([0.38252971, 0.56890993, 0.45281553, 0.88495521, 0.94479716,
       0.37938899])
数据帧:

x[x>0.3]
    a
0   0.382530
1   NaN
2   0.568910
3   0.452816
4   0.884955
5   0.944797
6   0.379389
因此,要获得具有所需形状(6,1)的序列,可以使用

x[x['a']>0.3]
返回

    a
0   0.382530
2   0.568910
3   0.452816
4   0.884955
5   0.944797
6   0.379389
然后,只有在完成所有操作之后,才能调用末尾的
.values
,以获得具有所需结果的numpy数组

现在,一般来说,在数组上的操作比在pandas对象上的操作快,但是使用pandas对象更容易,特别是当您需要进行大量数据处理时
你可能更喜欢与numpy一起工作,但是熊猫的选择是值得知道的,在我看来更容易和更简单


希望这有帮助

在我这边,我尝试在一些数据帧上运行
df[df.columns[0]].values.shape
,得到了
(x,)
,而不是
(x,1)
。您确定在运行代码时正在复制它吗?或者,您使用的是什么版本的
pandas
numpy
?对不起,我弄错了,我写的不一样。在我的代码中,我以不同的方式加载数组:
a=df.filter(regex=“Power”).values
,我的数据帧只有一列,名称中有字符串“Power”。好的,现在我也这样做了,得到了
(x,1)
。然而,我在第二行得到了另一个结果:如果我做了
a=df[[df.columns[0]]]]
(它有一个shape
(x,1)
),我运行
b=a[a>0]
,但仍然得到shape
(x,1)
。如果我有一个数组a有一个shape
(x,1)
,我运行
b=a[a>0]
,它有一个shape(如果a总是正值)
(x,)
而不是
(x,1)
。我的pandas版本是
'0.23.4'
,我的numpy版本是
'1.16.4'
。我编辑了原始问题,以澄清我遇到的问题。好的,我知道区别是什么。看看我的回答是否有帮助。谢谢你的回答,这真的很清楚。不幸的是,我的数据框大约有4000列,使用pandas(我更喜欢它,因为它对我来说更容易)对我的计算来说太慢了。在我的代码中,我使用pandas加载所需的列,然后使用numpy进行计算。啊,好吧。值得一试。
x[x['a']>0.3]
    a
0   0.382530
2   0.568910
3   0.452816
4   0.884955
5   0.944797
6   0.379389