【问题标题】:How to Map String in A Dataframe from A Corresponding String List如何从对应的字符串列表映射数据框中的字符串
【发布时间】:2020-06-17 13:40:36
【问题描述】:
假设我有这个带有特定列 Tweet 的数据框 A:
TWEET
-----
kamu ngajak gelut
dtnggu kedatangannya
dia jadi pampir
还有另一个数据框 B,结构如下:
ORIGIN TRANSFORMED
-----------------------------
ngajak mengajak
dtnggu ditunggu
pamir vampir
有没有办法将数据框 A 的字符串映射到数据框 B,所以只要有字符串匹配,来自 TRANSFORMED 列的单词将根据 TWEET 列中的 ORIGIN 列替换相应的字符串?我想要的结果:
TWEET
-----
kamu mengajak gelut
ditunggu kedatangannya
dia jadi vampir
任何帮助表示赞赏。谢谢。
【问题讨论】:
标签:
python
string
pandas
replace
mapping
【解决方案1】:
假设ORIGIN 列具有唯一值。
In [88]: bstr = r'''
...: ORIGIN TRANSFORMED
...: ngajak mengajak
...: dtnggu ditunggu
...: pamir vampir'''
In [89]: astr = r'''
...: TWEETS
...: kamu ngajak gelut
...: dtnggu kedatangannya
...: dia jadi pampir'''
In [90]: dfa = pd.read_table(io.StringIO(astr), sep='\\n', engine='python')
In [91]: dfb = pd.read_table(io.StringIO(bstr), sep='\\s+')
In [92]: def replace(word, lookup_df, search_col, ans_col):
...: match = lookup_df[search_col] == word
...: if match.any():
...: return lookup_df[match][ans_col].values[0]
...: else:
...: return word
...:
In [93]: dfa['TWEETS'] = dfa['TWEETS'].apply(lambda row: ' '.join([replace(word, dfb, 'ORIGIN', 'TRANSFORMED') for word in row.split(' ')]))
In [94]: dfa
Out[94]:
TWEETS
0 kamu mengajak gelut
1 ditunggu kedatangannya
2 dia jadi pampir
【解决方案2】:
这可能会对你有所帮助。
我用你的数据为你的场景创建了两个数据框。
df1:
data = '''kamu ngajak gelut dtnggu kedatangannya dia jadi pampir'''
df1 = pd.DataFrame({'TWEET': [data]})
df2:
ORIGIN TRANSFORMED
0 ngajak mengajak
1 dtnggu ditunggu
2 pampir vampir
代码:
for or_word in df2['ORIGIN'].values.tolist():
if any(df1['TWEET'].str.contains(or_word)):
transformed_word = df2['TRANSFORMED'].iloc[df2.index[df2['ORIGIN'] == or_word].tolist()[0]]
print(transformed_word)
df1['TWEET'] = df1['TWEET'].str.replace(or_word, transformed_word)
输出:
['kamu mengajak gelut ditunggu kedatangannya dia jadi vampir']