【问题标题】:create a single column containing all non-null values from multiple columns in a pandas dataframe创建一个包含来自 pandas 数据框中多列的所有非空值的单列
【发布时间】:2018-08-14 03:22:20
【问题描述】:

我已经使用 iterrows() 完成了这项工作,但希望有一种更快、更优雅的方式来实现预期的结果。

问题陈述:

我在数据框(df_orders) 的列子集(product1, product2, ...) 中有几行 NaN 和 notnull 值。我想获取该子集中的每个非空值并创建一个新列,其中包含从第一行一直到最后一行的每个值。

示例: 创建一个包含所有订购产品的列。

>>> df_orders = pd.read_csv('orders.csv')

>>> df_orders 

OrderNo              CustName  Product1  Product2  Product3  Product4  Product5
    0    20043          Sanjay Singh       131       320   320   131       nan
    1    20042        William Sonoma       420       420   131   320       511
    2    20041          Maria Alonso       320       420   320   nan       nan
    3    20040              Jim Beam       511       131   nan   nan       nan
    4    20039          Gunter Grass       320       131   131   131       nan
    5    20038         Billy Joe Bob       420       511   511   nan       nan
    6    20037  Cynthia Silvia Stout        55        12   131    55        12
    7    20036         Alan Ginsburg       131       320   320    12       nan
    8    20035       Ronald McDonald       131       131   511   nan       nan

我正在寻找的结果:

创建一个名为 df_product_list 的新数据框。从 df_orders 中的第一行开始,在 df_product_list 中为每个非空产品列值创建一个新行。

因为来自 Sanjay Singh 的订单排在第一位,并且产品列中有四个非空值,所以 df_product_list 的前四行将是 131、320、320 和 131。

>>> df_product_list
ProdCode
0    131
1    320
2    320
3    131
4    420
5    420
6    131
7    320
8    511
9    320
10   420
11   320
12   511
13   131
14   320
15   131
16   131
17   131
...
...

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    让我们试试filterstack

    pd.Series(df.filter(like='Product').stack().values, name='product_list')
    
    0     131.0
    1     320.0
    2     320.0
    3     131.0
    4     420.0
    5     420.0
    ...
    

    为了提高性能,您可能希望在 numpy 空间中操作并使用 np.isnan 删除 NaN(DataFrame.stack 会这样做,但成本远高于预期)。

    arr = df.filter(like='Product').values.ravel()
    pd.Series(arr[~np.isnan(arr)].astype(np.int), name='product_list')
    0     131.0
    1     320.0
    2     320.0
    3     131.0
    4     420.0
    5     420.0
    ...
    

    【讨论】:

    • 我无法让 np.isnan 工作,但第一个选项效果很好。感谢您帮助我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2018-03-14
    相关资源
    最近更新 更多