Python 熊猫:列上的条件拆分

Python 熊猫:列上的条件拆分,python,pandas,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中的条目是(.)后面的字母(因此该条目=A.A)。 C列或者列出点之前和之后的字母,或者只列出点之后的字母 我们的想法是将这些点和列表分开。因此,C列应该首先用逗号分开,以分隔行(这是可行

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

 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中的条目是(.)后面的字母(因此该条目=A.A)。 C列或者列出点之前和之后的字母,或者只列出点之后的字母

我们的想法是将这些点和列表分开。因此,C列应该首先用逗号分开,以分隔行(这是可行的)。问题在于,每当B中可能有不同的字母时,B都会出现,因为分开后,B也应该只包含1个字母(C列正确的on)

所以结果应该是这样的:

 A     B     C
 1     A     A
 2     A     B
 3     B     C
 4     A     A
 4     B     B
 4     B     C     
是否有人能帮助我确保B列包含正确的(即配件)信息,如C列所示


感谢并致以亲切的问候。

首先,堆叠数据帧以获得组合:

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'})
输出:

   A  B  C
0  1  A  A
1  2  A  B
2  3  B  C
3  4  A  A
4  4  A  B
5  4  B  C
理解地

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

我不明白你怎么会得到
4B
而不是
4B