我有兩列,每個字串都有一個串列,命名為 Tag 1,Tag 2。簡單來說,我需要檢查單元格中的字串是否在相鄰列的任何位置找到,如果是,則交換值。
現有資料框
Tag 1 Tag 2
Amazon Twitter
Amazon Google
eBay Amazon
Reddit Facebook
期望的輸出
Tag 1 Tag 2
Amazon Twitter
Amazon Google
Amazon eBay
Reddit Facebook
在預期的結果中,您可以看到 Amazon 已與 eBay 交換位置,因為它位于 Tag 1 列中。
最小可重現示例
import pandas as pd
data = {'Tag 1': ['Amazon', 'Amazon', 'eBay', 'Reddit'],
'Tag 2': ['Twitter', 'Google', 'Amazon', 'Facebook']}
df = pd.DataFrame(data)
我一直在研究類似的帖子,但似乎不能完全正確。
到目前為止,這是我的代碼。
uj5u.com熱心網友回復:
您可以使用pd.where檢查“標簽 2”中isin的值何時存在于“標簽 1”中,并在分配回時交換值:
df[['Tag 1','Tag 2']] = df[['Tag 2','Tag 1']].where(
df['Tag 2'].isin(df['Tag 1'].tolist()), df[['Tag 1','Tag 2']].values)
列印回來:
Tag 1 Tag 2
0 Amazon Twitter
1 Amazon Google
2 Amazon eBay
3 Reddit Facebook
uj5u.com熱心網友回復:
這可能會做到
import pandas as pd
import numpy as np
data = {'Tag 1': ['Amazon', 'Amazon', 'eBay', 'Reddit'],
'Tag 2': ['Twitter', 'Google', 'Amazon', 'Facebook']}
df = pd.DataFrame(data)
values = np.unique(df['Tag 1'].values) # All unique values in Tag 1
swapped = [] # So we don't double swap
for val in values:
rows = df.loc[df['Tag 2'] == val] # Get rows in Tag 2 that matches
for idx, row in rows.iterrows():
if idx in swapped: # Ignore if already swapped
continue
# Swap the values
temp = df.iloc[idx]['Tag 2']
df.iloc[idx]['Tag 2'] = df.iloc[idx]['Tag 1']
df.iloc[idx]['Tag 1'] = temp
swapped.append(idx)
可能有更有效的解決方案,但我認為這很清楚。它遍歷“標簽 1”列中的每個唯一值,并檢查“標簽 2”列中的匹配項,然后交換它們。我不確定您是否想避免雙重交換,但如果不是必需的,可以將其洗掉。
uj5u.com熱心網友回復:
@sophocles 的答案可能是正確的。
但是,如果您只想按字典順序重新排序列,請嘗試:
tags = ['Tag 1', 'Tag 2']
df[tags] = df[tags].apply(lambda x: sorted(tuple(x)), axis=1, result_type='expand')
print(df)
# Output
Tag 1 Tag 2
0 Amazon Twitter
1 Amazon Google
2 Amazon eBay
3 Facebook Reddit
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408952.html
標籤:
