我有一个pandas数据框,其中包含两列中的字符串。 我想为每个列提取除数字之外相似的所有字符串,并添加新列,其中类似文本与idx值交换。
由此:
Id Name1 Name2
0 Alpha 1 Bravo 3
1 Alpha 2 Alpha 2
2 Bravo 3 Alpha 1
To This:
Id Name1 Name2 NewCol1 NewCol2
0 Alpha 1 Bravo 3 1 2
1 Alpha 2 Zero 2 1 3
2 Bravo 3 Alpha 1 2 1
如果没有大的迭代循环,是否有一个简单的解决方案?
答案 0 :(得分:3)
我认为需要Series
创建MultiIndex
,stack
删除digit
,使用factorize
创建类别,使用unstack
和{ {3}}原创:
s = df.set_index('Id').stack().str.replace('\d+', '')
df = df.join(pd.Series(pd.factorize(s)[0] + 1, index=s.index).unstack().add_prefix('New'))
print (df)
Id Name1 Name2 NewName1 NewName2
0 0 Alpha 1 Bravo 3 1 2
1 1 Alpha 2 Zero 2 1 3
2 2 Bravo 3 Alpha 1 2 1
<强>详情:
print (s)
Id
0 Name1 Alpha
Name2 Bravo
1 Name1 Alpha
Name2 Zero
2 Name1 Bravo
Name2 Alpha
dtype: object
print (pd.factorize(s)[0] + 1)
[1 2 1 3 2 1]
答案 1 :(得分:0)
您可能需要使用循环来迭代列名。对于行,请使用pandas.Series.str.replace
import pandas as pd
df = pd.DataFrame({'Name1' :['Alpha 1', 'Aplha 2', 'Bravo 3'], 'Name2' : ['Bravo 3', 'Alpha 2', 'Alpha 1']})
for name in df.columns.tolist():
df["newCol" + name.replace("Name", "")] = df[name].str.split(expand=True)[1]