如何根据条件将值分配给数据框的列?

问题描述:

我有一个数据帧,它看起来像以下:如何根据条件将值分配给数据框的列?

POSITION Code_Count 
    S1  {"[471E;1]"} 
    S2  {"[471E;1]"} 
    S3  {"[471E;1]"} 
    S4  {"[471E;1]"} 
    S5  {"[471E;1]"} 
    S6  {"[5812;1]"} 
    S7  {"[471E;1]"} 
    S8  {"[471E;1]"} 
    T1  {"[7A2A;1]"} 
    T2  {"[471E;1]"} 
    T3  {"[7C95;1]"} 
    T4  {"[471E;1]"} 
    T5  {"[471E;1]"} 
    T6  {"[471E;1]"} 
    T7  {"[471E;1]"} 
    T8  {"[471E;1]"} 

在Code_Count列中的第一个字符串是一个代码,号码是计数。 此外,代码被分为4类A到D.所有类别中出现的代码列表如下: 代码被分为4类,如A到D如下:

类别A包含这些代码:7749 7783 7784 7786 7A14 7AC5 7C88 7C92 7C93 7C95 C749 C783 C784 C786 CA14 CAC5 CC88 CC92 CC93 CC95 442A 49C2

类别B具有这些代码:1D 32 430B 4415 448E 4490 4492 457A 457B 496C 4970 778A 7A09 7A2A 7A2C 7C7C 7C80 C78A CA09 CA2A CA2C

Cate血淋淋的C有这些代码:7A7F 7A80 7C7E CA7F CA80 CAC8 7AC8 C77E 445A 496E 471E 49CA

类别d:7AF0 7AF1 7AF2 7AF3 CAF0 CAF1氟化钙CAF3 4616 4617 4618 5812

我想为我的最终数据帧包含根据初始数据帧中存在的代码按照它们所属的类别对代码进行排序,将代码计数到相应的位置。例如,根据上面的数据帧的数据帧输出应为:

POSITION Category A  Category B  Category C  Category D 
    S1   0    0    1    0 
    S2   0    0    1    0 
    S3   0    0    1    0 
    S4   0    0    1    0 
    S5   0    0    1    0 
    S6   0    0    0    1 
    S7   0    0    1    0 
    S8   0    0    1    0 
    T1   0    1    0    0 
    T2   0    0    1    0 
    T3   1    0    0    0 
    T4   0    0    1    0 
    T5   0    0    1    0 
    T6   0    0    1    0 
    T7   0    0    1    0 
    T8   0    0    1    0   

我已经采用的方法str.contains但没有任何成功尝试。任何帮助将非常感激。提前感谢!

+0

为什么周围的值有花括号中'Code_Count'列?整个事情是一个字符串,也许就像这样:''{“[471E; 1]”}''? – Kartik

+0

不是。这可能是从SQL查询中提取的,并且是格式或其他内容。 – Ruffy26

我想你可以通过stripsplit首先提取值,然后通过ixisin形成的遮掩添加Count。最后drop不必要的列和fillna0

catA = ['7749','7783','7784','7786','7A14','7AC5','7C88','7C92','7C93','7C95','C749','C783','C784','C786','CA14','CAC5','CC88','CC92','CC93','CC95','442A','49C2'] 
catB = ['1D','32','430B','4415','448E','4490','4492','457A','457B','496C','4970','778A','7A09','7A2A','7A2C','7C7C','7C80','C78A','CA09','CA2A','CA2C'] 
catC = ['7A7F','7A80','7C7E','CA7F','CA80','CAC8 7AC8 C77E','445A','496E','471E','49CA'] 
catD = ['7AF0','7AF1','7AF2','7AF3','CAF0','CAF1','CAF2','CAF3','4616','4617','4618','5812'] 

df[['Code','Count']] = df.Code_Count.str.strip('{["]}').str.split(';', expand=True) 
df['Category A'] = df.ix[df.Code.isin(catA), 'Count'] 
df['Category B'] = df.ix[df.Code.isin(catB), 'Count'] 
df['Category C'] = df.ix[df.Code.isin(catC), 'Count'] 
df['Category D'] = df.ix[df.Code.isin(catD), 'Count'] 
df.drop(['Code_Count', 'Code', 'Count'], axis=1, inplace=True) 

df[['Category A','Category B','Category C','Category D']] = 
df[['Category A','Category B','Category C','Category D']].fillna(0) 
print (df) 
    POSITION Category A Category B Category C Category D 
0  S1   0   0   1   0 
1  S2   0   0   1   0 
2  S3   0   0   1   0 
3  S4   0   0   1   0 
4  S5   0   0   1   0 
5  S6   0   0   0   1 
6  S7   0   0   1   0 
7  S8   0   0   1   0 
8  T1   0   1   0   0 
9  T2   0   0   1   0 
10  T3   1   0   0   0 
11  T4   0   0   1   0 
12  T5   0   0   1   0 
13  T6   0   0   1   0 
14  T7   0   0   1   0 
15  T8   0   0   1   0 
+0

我正面临一个奇怪的问题。所有值都显示为0.在输入fillna(0)之前,所有值都显示为NaN。任何想法为什么发生这种情况?非常感谢你! – Ruffy26

+0

所有值?你的输出中没有'1'?或者''fillna'之前''NaN'而不是'0'? – jezrael

+0

是的,输出中没有1。即使在fillna之前,所有的值都是NaN。 – Ruffy26