熊猫:在栏上进行条件拆分

时间:2018-08-10 05:05:23

标签: python pandas

我有以下问题:我有下表:

 A     B     C
 1     A     A
 2     A     A.B
 3     B     B.C
 4     A,B   A.A,A.B,B.C

列A为索引(1到4)。 B列列出了字母,该字母出现在C点之前(如果有的话,如果没有,则是隐式的,因此(C,1)= A中的条目是(。)之后的字母(因此此条目= AA)。 C列要么列出该点之前或之后的字母,要么仅列出该点之后的字母。

想法是将这些点分开并列出。因此,应首先用逗号将C列拆分为单独的行(有效)。这里的问题是,只要B中可能有不同的字母-因为拆分之后,B还应该只包含1个字母(C列的正确字母为开)。

所以结果应该像这样:

 A     B     C
 1     A     A
 2     A     B
 3     B     C
 4     A     A
 4     B     B
 4     B     C     

有人可以帮助我确保B列包含正确的(即拟合)信息,该信息在C列中表示吗?

谢谢和亲切的问候。

2 个答案:

答案 0 :(得分:1)

首先,堆叠数据框以获取组合:

setState

然后将单个条目替换为对应的条目并应用out = ( df.set_index(['A', 'B']).C .str.split(',').apply(pd.Series) .stack().reset_index([0,1]).drop('B', 1) ) A 0 0 1 A 1 2 A.B 2 3 B.C 3 4 A.A 4 4 A.B 5 4 B.C

pd.Series

输出:

(out.set_index('A')[0].str
    .replace(r'^([A-Z])$', r'\1.\1')
    .str.split('.').apply(pd.Series)
    .reset_index()
).rename(columns={0: 'B', 1: 'C'})

答案 1 :(得分:1)

理解力强

def m0(x):
    """Take a string, return a dictionary split on '.' or a self mapping"""
    if '.' in x:
        return dict([x.split('.')])
    else:
        return {x: x}

def m1(s):
    """split string on ',' then do the dictionary thing in m0"""
    return [*map(m0, s.split(','))]

pd.DataFrame([
    (a, b, m[b])
    for a, B, C in df.itertuples(index=False)
    for b in B.split(',')
    for m in m1(C) if b in m
], df.index.repeat(df.C.str.count(',') + 1), df.columns)

   A  B  C
0  1  A  A
1  2  A  B
2  3  B  C
3  4  A  A
3  4  A  B
3  4  B  C