【问题标题】:Create new columns based on number of values in list in other pandas column?根据其他熊猫列中列表中的值数量创建新列?
【发布时间】:2021-08-01 23:47:03
【问题描述】:

我有一个看起来像的熊猫数据框

country       region           values
   A           CA           [0, 0, 1, .5]
   B           NE           [0, 0, 0, 1]
   C           CA           [1, 1, 1, .5]
   D           CA           [1, 0, 1, .5]
   E           EE           [0, .5, .5, 0]
   F           NE           [0, 1, 1, 1]
   G           EE           [0, 0, 0, 0]
   H           NE           [0, .5, 1, .5] 
   I           EE           [nan, 0]

我想知道哪些国家的所有 4 个值 1、.5、0 或 3 个值 1、0、.5 或 2 个值 1、.5 或 0。值 1 等于采用(A ), .5 等于部分采用 (PA),等于未采用 (NA)。例如:

     country       region      values         #A_all4      #A_any3    #A_any2       #PA_all4       #PA_any3       #PA_any2        
   A           CA           [0, 0, 1, .5]         0            0         0              0                0                0
   B           NE           [0, 0, 0, 1]          0            0         0              0                0                0
   C           CA           [1, 1, 1, .5]         0            1         0              0                0                0
   D           CA           [1, 0, 1, .5]         0            0         1              0                0                0     
   E           EE           [0, .5, .5, 0]        0            0         1              0                0                0
   F           NE           [0, 1, 1, 1]          0            1         0              0                0                1
   G           EE           [0, 0, 0, 0]          0            0         0              0                0                0
   H           NE           [0, .5, 1, .5]        0            0         0              0                0                1
   I           EE           [nan, 0]              0            0         0              0                0                0

我想为所有值(已采用、部分采用和未采用)执行此操作,但我没有足够的空间来执行此操作。尝试使用 lambda 进行过滤,但它没有给我需要的结果。任何建议都会很棒!谢谢

【问题讨论】:

  • H 国是否也将 #A_any2 设置为 1,因为这两个 .5?
  • 不只是,PA_any2 因为这些值被视为因素,而不是数字

标签: python pandas list lambda filter


【解决方案1】:

IIUC,试试:

dfi = (df.loc[:, 'values']
         .explode()
         .groupby(level=0)
         .value_counts()
         .rename('count')
         .reset_index())

dfi = dfi.query('values != 0.0 and count > 1')

(df.assign(**pd.crosstab(dfi['level_0'], 
                         dfi['count']).reindex([4,3,2], 
                                               fill_value=0, axis=1)
           .add_prefix('#A_all')).fillna(0))

输出:

  country region            values  #A_all4  #A_all3  #A_all2
0       A     CA    [0, 0, 1, 0.5]      0.0      0.0      0.0
1       B     NE      [0, 0, 0, 1]      0.0      0.0      0.0
2       C     CA    [1, 1, 1, 0.5]      0.0      1.0      0.0
3       D     CA    [1, 0, 1, 0.5]      0.0      0.0      1.0
4       E     EE  [0, 0.5, 0.5, 0]      0.0      0.0      1.0
5       F     NE      [0, 1, 1, 1]      0.0      1.0      0.0
6       G     EE      [0, 0, 0, 0]      0.0      0.0      0.0
7       H     NE  [0, 0.5, 1, 0.5]      0.0      0.0      1.0
8       I     EE          [nan, 0]      0.0      0.0      0.0

【讨论】:

  • 这对我获取其他值没有帮助
  • @mputil 我不明白。你能详细说明一下吗?
  • 这只会帮助我获得 A 列,但我将其他列列为我的问题。此外,它会将 0.5 视为一个数值,但它被视为一个因子/对象。
【解决方案2】:

你可以试试这个,但是它与你需要预先替换 nan 值并删除 unwated 列并不完全相同:

from collections import Counter
def func(ls):
    v,c = Counter(ls).most_common()[0]
    return 0 if v is '0' else c

df['v'] = df['values'].map(func)
df['v1'] = 1

df_all = df.pivot(columns=['v'], values=['v1']).fillna(0)
df_all.columns = ["all_" + str(x) for _,x in df_all.columns]

df.join(df_all).drop(['v', 'v1'], axis=1)

#   country region          values  all_0  all_1  all_2  all_3
# 0       A     CA   [0, 0, 1, .5]    1.0    0.0    0.0    0.0
# 1       B     NE    [0, 0, 0, 1]    1.0    0.0    0.0    0.0
# 2       C     CA   [1, 1, 1, .5]    0.0    0.0    0.0    1.0
# 3       D     CA   [1, 0, 1, .5]    0.0    0.0    1.0    0.0
# 4       E     EE  [0, .5, .5, 0]    1.0    0.0    0.0    0.0
# 5       F     NE    [0, 1, 1, 1]    0.0    0.0    0.0    1.0
# 6       G     EE    [0, 0, 0, 0]    1.0    0.0    0.0    0.0
# 7       H     NE  [0, .5, 1, .5]    0.0    0.0    1.0    0.0
# 8       I     EE        [nan, 0]    0.0    1.0    0.0    0.0

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2015-01-09
    • 2018-11-06
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多