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
。