我需要一些關于如何從一個單元格中提取多值以匹配同一行中的另一個單元格的指導。這將應用于整個資料幀并生成一個新的資料幀。
源資料
我的源資料示例如下。我無法更改來源,因為它以這種格式提供,我將每月將其提供給我。
Data source:
data = {'C1': ['Alpha, Charlie, Bravo','Beta, Gamma','Foxtrot, Delta'],
'C2': ['Alpha, San Francisco, US ; Charlie, New York, US ;
Bravo, London, UK', 'Beta, Singapore, Singapore ;
Gamma, Tokyo, Japan','[Foxtrot; Delta], Seoul, South Korea'],}
df = pd.DataFrame(data)
| C1 | C2 |
|---|---|
| 阿爾法、查理、布拉沃 | 阿爾法,舊金山,美國;查理,紐約,美國;布拉沃,倫敦,英國 |
| 貝塔,伽瑪 | Beta,新加坡,新加坡;日本東京伽瑪 |
| 狐步舞,三角洲 | [狐步舞;Delta], 首爾, 韓國 |
作為新資料框的預期結果
我希望在新的資料框中實作以下結果:
data2 = {'C1': ['Alpha', 'Charlie', 'Bravo','Beta', 'Gamma','Foxtrot', 'Delta'],
'C2': ['Alpha, San Francisco, US', 'Charlie, New York, US',
'Bravo, London, UK', 'Beta, Singapore, Singapore',
'Gamma, Tokyo, Japan','[Foxtrot; Delta], Seoul, South Korea',
'[Foxtrot; Delta], Seoul, South Korea'],}
new_df = pd.DataFrame(data2)
| N1 | N2 |
|---|---|
| Α | 阿爾法,舊金山,美國 |
| 查理 | 查理,紐約,美國 |
| 布拉沃 | 布拉沃,倫敦,英國 |
| 貝塔 | Beta, 新加坡, 新加坡 |
| 伽瑪 | 日本東京伽瑪 |
| 狐步舞 | [狐步舞;Delta], 首爾, 韓國 |
| 三角洲 | [狐步舞;Delta], 首爾, 韓國 |
我的實際結果(嘗試失敗)
我嘗試過嵌套的 for 回圈,其中 C1 將是外回圈,C3 將是內回圈。我得到以下結果:
data3 = {'C1': ['Alpha', 'Alpha', 'Alpha', 'Charlie', 'Charlie',
'Bravo','Beta', 'Beta', 'Gamma','Foxtrot', 'Delta'],
'C2': ['Alpha, San Francisco, US', 'Alpha, New York, US', 'Alpha, London, UK',
'Charlie, New York, US', 'Charlie, London, UK', 'Bravo, London, UK',
'Beta, Singapore, Singapore', 'Beta, Tokyo, Japan',
'Gamma, Tokyo, Japan',
[Foxtrot; Delta], Seoul, South Korea,
[Foxtrot; Delta], Seoul, South Korea],}
result_df = pd.DataFrame(data3)
| N1 | N2 |
|---|---|
| Α | 阿爾法,舊金山,美國 |
| Α | 查理,紐約,美國 |
| Α | 布拉沃,倫敦,英國 |
| 查理 | 查理,紐約,美國 |
| 查理 | 查理,倫敦,英國 |
| 布拉沃 | 布拉沃,倫敦,英國 |
| 貝塔 | Beta, 新加坡, 新加坡 |
| 貝塔 | 日本東京伽瑪 |
| 伽瑪 | 日本東京伽瑪 |
| 狐步舞 | [狐步舞;Delta], 首爾, 韓國 |
| 三角洲 | [狐步舞;Delta], 首爾, 韓國 |
我使用的腳本
我的腳本如下。
new_list = []
for idx, vals in enumerate(df['C1']):
vals = vals.split('; ')
locs = (df['C2'].values[idx]).split(' ; ')
for val in vals:
for loc in locs:
new_list.append((idx, val, loc))
new_df = pd.DataFrame(data=new_list, columns=['N1', 'N2'])
任何幫助將不勝感激。謝謝。
uj5u.com熱心網友回復:
您的資料中有兩個怪癖。
- 在某些行的方括號記憶體在分號,這使得拆分我
;不是一個好主意 - 映射兩列的值數量不等
嘗試這個:
import re
def replace_semi_colon(s):
return re.sub(r'\[(.*?)\]', lambda x: '[' x.group(1).replace(';', ':') ']', s)
# temporarily replace the semi-colon inside square brackets with colon
df['C2'] = df['C2'].apply(lambda x: replace_semi_colon(x))
# now split the values
df['C1'] = df['C1'].str.split(',')
df['C2'] = df['C2'].str.split(';')
# make the number of values in each column equal
df['C2'] = df.apply(lambda x : x['C2'] * len(x['C1']) if len(x['C1'])>len(x['C2']) else x['C2'] , axis =1)
df = df.explode(['C1','C2'])
# replace the ':' back to ';'
df['C2'] = df['C2'].apply(lambda x: x.replace(':',';'))
它給出的結果:
C1 C2
0 Alpha Alpha, San Francisco, US
0 Charlie Charlie, New York, US
0 Bravo Bravo, London, UK
1 Beta Beta, Singapore, Singapore
1 Gamma Gamma, Tokyo, Japan
2 Foxtrot [Foxtrot; Delta], Seoul, South Korea
2 Delta [Foxtrot; Delta], Seoul, South Korea
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516776.html
標籤:Python熊猫数据框
上一篇:我必須在方法中處理位圖嗎?
下一篇:如何洗掉特定列具有特殊文本的行?
