我刚刚注意到,对Pandas DataFrame的索引进行的字符串操作无法维护索引,因此将结果分配回该数据帧有点尴尬。例如(以及我注意到的情况):
import pandas as pd
df = pd.DataFrame(
[[1,2],[3,4],[5,6]],
index=['a11','b12','c13'])
df['num'] = df.index.str.extract('([0-9]+)')
给我:
0 1 num
a11 1 2 NaN
b12 3 4 NaN
c13 5 6 NaN
由于索引已丢失,只是恢复为[0,1,2]
花了一些调试才能意识到此索引丢失是我得到NaN的原因,但是一旦完成,很明显我可以做:
df['num'] = df.index.str.extract('([0-9]+)').set_index(df.index)
这是对的,还是有其他方法可以维护索引?
答案 0 :(得分:1)
如何使用assign
?
df.assign(num=df.index.str.extract('([0-9]+)').values)
答案 1 :(得分:1)
您可以使用expand
命令来获得与您相同的期望结果,
df['num'] = df.index.str.extract('([0-9]+)', expand=False)
expand=False
返回序列或索引或数据框,因为只有一个提取组,所以可以使用expand参数。
答案 2 :(得分:1)
您将不得不使用expand
参数:
df['num'] = df.index.str.extract('([0-9]+)', expand=False)
来自docs:
展开:布尔值,默认为True
如果为True,则返回每个捕获组只有一列的DataFrame。如果为False,则如果有一个捕获组,则返回一个Series / Index或 如果有多个捕获组,则为DataFrame。
0.18.0版中的新功能。