我有以下问题:我有下表:
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列中表示吗?
谢谢和亲切的问候。
答案 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