将np.array数据添加到熊猫数据框中的列后,是否可以对其排序?

时间:2019-08-14 16:06:29

标签: python pandas sorting dataframe

我有一列np.array数据,我将其添加到熊猫数据框的最后一列。但是,我需要在该np.array中以升序排序的数据。 (在获取它的数据框中,它没有按升序排序。)

数据帧结构:

    GFP_spot_1_position, GFP_spot_2_position, GFP_spot_3_position, ...  
    0 _        0.2,                 0.4,              0.6,              NaN          
    1 _        0.8,                 0.2,              NaN,              NaN         
    2 _        0.7,                 0.5,              0.6,              0.9      
    3 _        0.5,                 NaN,              0.1,              NaN      

我希望它看起来像什么:

    gfp_spots_all                         
    0 _ [0.2, 0.4, 0.6, nan]             
    1 _ [0.2, 0.8, nan, nan]               
    2 _ [0.5, 0.6, 0.7, 0.9]            
    3 _ [0.1, 0.5, nan, nan] 

下面的代码实际上是什么样子:

    gfp_spots_all                                      
    0 _        [0.2,                 0.4,              0.6,              NaN]          
    1 _        [0.8,                 0.2,              NaN,              NaN]       
    2 _        [0.7,                 0.5,              0.6,              0.9]      
    3 _        [0.5,                 NaN,              0.1,              NaN]      

这是我到目前为止的代码:

df = pd.read_csv('dfall.csv')

dfgfp = df.loc[:, 'GFP_spot_1_position':'GFP_spot_4_position']

df['gfp_spots_all'] = dfgfp.apply(lambda r: list(r), 
    axis=1).apply(np.array)

df.head()

我无法对数组中的值进行显示或排序。请帮忙!另外,我也是python的新手,所以我正在学习。请随时纠正我的草率代码。

4 个答案:

答案 0 :(得分:0)

看来可以,请参见下面的代码

arr = np.array([[3,5,1,7,4,2],[12,18,11,np.nan,np.nan,18]])
df = pd.DataFrame(arr)
print(df)

输出

      0     1     2    3    4     5
0   3.0   5.0   1.0  7.0  4.0   2.0
1  12.0  18.0  11.0  NaN  NaN  18.0
np.ndarray.sort(df.values)
print(df)

输出

     0     1     2     3    4    5
0   1.0   2.0   3.0   4.0  5.0  7.0
1  11.0  12.0  18.0  18.0  NaN  NaN

但是它将值和列不匹配,您打算这样做吗?

答案 1 :(得分:0)

按照@G。安德森(Anderson)的评论,在您的lambda表达式中添加sorted()将解决此问题。实际上,示例中的很多代码都是多余的:

dfgfp = df.loc[:, 'GFP_spot_1_position':'GFP_spot_4_position']

df['gfp_spots_all'] = dfgfp.apply(lambda r: sorted(r), axis=1) 

我相信这会满足您的要求。

答案 2 :(得分:0)

必须有一种更多的pythonique方法,但这是解决此问题的一种方法:

In [1]:
import pandas as pd

# Create the Dataframe
data = {'col1': [[9, 3], [2, 4], [7, 6], [3, 3], [8, 0], [0,4]], 'col2': [[1,3], [9,4], [4,2], [5,1], [3,7], [9,8]]}
df = pd.DataFrame(data=data)

## Loop on each row
for i in range(len(df)):
    ## Loop on each column
    for k in range(len(df.columns)):
        df.iloc[i][k].sort()

df

Out [1]:
    col1    col2
0   [3, 9]  [1, 3]
1   [2, 4]  [4, 9]
2   [6, 7]  [2, 4]
3   [3, 3]  [1, 5]
4   [0, 8]  [3, 7]
5   [0, 4]  [8, 9]

答案 3 :(得分:0)

describe 'passing values to shared context with let()' do
  # "customization block"
  include_context 'a context' do
    # set value_from_spec here
    let(:value_from_spec) { 1 }
  end

  describe 'the context' do
    it 'should read the passed value in a let() block' do
      expect(a_value_from_context).to eq(0)
    end

    it 'should read the passed value in a before() block' do
      expect(@another_value_from_context).to eq(2)
    end
  end
end