【问题标题】:Can I sort my np.array data once it has been added to a column in a pandas dataframe?将 np.array 数据添加到 pandas 数据框中的列后,我可以对其进行排序吗?
【发布时间】:2019-08-15 04:29:01
【问题描述】:

我有一列 np.array 数据添加到我的 pandas 数据框的最后一列。但是,我需要在该 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新手,所以我边走边学。请随时纠正我草率的代码。

【问题讨论】:

标签: python pandas sorting dataframe


【解决方案1】:

肯定有更多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]

【讨论】:

  • 啊,非常感谢!这不是完整的答案,但它有帮助!
【解决方案2】:

好像可以,看下面的代码

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

但它会使值和列不匹配,你是故意的吗?

【讨论】:

    【解决方案3】:

    根据@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) 
    

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

    【讨论】:

      【解决方案4】:
      # Here's what worked   
      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)
      dfjust = pd.DataFrame([df.gfp_spots_all]).transpose()
      
      
      ## Loop on each row
      for i in range(len(dfjust)):
           for k in range(len(dfjust.columns)):
               dfjust.iloc[i][k].sort()
      
      dfjust.head()
      
      [out:]
          gfp_spots_all .      
      0   [3.4165, 19.63, nan, nan]                       
      1   [6.7447, 18.044, nan, nan]         
      2   [5.088, 10.261, nan, nan]         
      3   [5.4081, 16.097, nan, nan]     
      4   [4.2675, nan, nan, nan]      
      
      
      5 rows × 1 columns
      

      【讨论】:

        猜你喜欢
        • 2020-12-31
        • 2019-06-29
        • 2020-02-29
        • 2013-06-05
        • 1970-01-01
        • 2017-12-26
        • 1970-01-01
        • 2012-09-03
        • 2020-04-23
        相关资源
        最近更新 更多