使用特殊字符过滤df

1 python lambda dataframe python-3.x pandas

大家好我有一个像下面的df: -

df = pd.DataFrame.from_records([
    {'0':'a:1','1':'b:2','2':'c:abc' },
    {'0':'a:2','1':'b:5','2':'c:afbc'}
])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想把它转换成如下的df: -

在此输入图像描述

我想用值重命名列索引,列中before :的值应该是任何值after :

到目前为止,我正在努力,首先重命名,然后从开头删除字符: -

dff.rename(columns={'0': 'a', '1': 'b', '2': 'c',}, inplace=True)
dff['a'] = dff['a'].map(lambda x: str(x)[2:])
dff['b'] = dff['b'].map(lambda x: str(x)[2:])
dff['c'] = dff['c'].map(lambda x: str(x)[2:])
Run Code Online (Sandbox Code Playgroud)

我想要一些帮助,如果有任何一个衬垫或lambda功能,我可以使用,因为我有超过20列.

PS - 原始数据帧中的0,1,2是列索引.只是为了演示我已经将它们用作列名.

piR*_*red 6

字典列表

pd.DataFrame([dict(x.split(':') for x in r) for r in df.values])

   a  b     c
0  1  2   abc
1  2  5  afbc
Run Code Online (Sandbox Code Playgroud)

替代

pd.DataFrame([*df.apply(lambda r: dict(r.str.split(':').values), 1)])
Run Code Online (Sandbox Code Playgroud)

回应OP的评论

当列名称多于一个字符aa或类似时间时,代码不起作用.其唯一workign当列名就好了,B,C,不与AA,BBBB,CCCCCC - ak333

考虑数据帧

df = pd.DataFrame([
    {'0': 'aa:1', '1': 'bbb:2', '2': 'cccc:abc'},
    {'0': 'aa:2', '1': 'bbb:5', '2': 'cccc:afbc'}
])
df

      0      1          2
0  aa:1  bbb:2   cccc:abc
1  aa:2  bbb:5  cccc:afbc
Run Code Online (Sandbox Code Playgroud)

相同的解决方案导致

pd.DataFrame([dict(x.split(':') for x in r) for r in df.values])

  aa bbb  cccc
0  1   2   abc
1  2   5  afbc
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是`DataFrame`构造函数如何与一个dicts列表一起工作,但是当你想要传递一系列dicts时你需要`from_records`. (2认同)