是否根据其他熊猫列中列表中的值数创建新列



我有一个熊猫数据帧,看起来像

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个值为0、.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进行过滤,但它没有给我所需的结果。任何建议都很好!谢谢

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

您可以尝试这样做,但这与您需要预先替换nan值并删除未处理的列不完全相同:

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

最新更新