問題:是否有簡化整個程序的功能?
所以我試圖清理資料。資料來源:UN Energy Table(會自動下載xls檔案) 有問題的資料就是這個xls變成dataframe后的'Country'列。

任務是洗掉附在國家名稱上的括號和數字。我所做的是,找到所有包含數字或括號的國家/地區名稱,將其轉換為串列,找到干凈的名稱并通過回圈逐個替換它們。
# Finding all dirty country names
dirtyNames = df1[df1['Country'].str.contains('[A-Za-z ][0-9/(/)]')==True]
# Changing them to list
dirtyNames = dirtyNames['Country'].tolist()
for name in dirtyNames:
clean = re.split('[0-9/(/)]', name)[0]
df1.replace(name,clean, inplace=True)
但是有這個功能嗎?如果我必須制作一個回圈,我覺得它必須有一個功能。我嘗試了來自互聯網的示例,將我的資料集固定到這些中,
df['first_five_Letter']=df['Country (region)'].str.extract(r'(^w{5})')
和其他類似的方法,但我不斷收到AttributeError: Can only use .str accessor with string values!錯誤。
uj5u.com熱心網友回復:
由于您想洗掉字串末尾的括號中的數字或文本(或可能同時洗掉,但數字始終位于末尾),因此您可以通過一個正則運算式替換來做到這一點:
df = pd.read_excel('Energy Indicators.xls', skiprows=17, usecols='C:F',names=['Country', 'Supply', 'per Capita', 'Renewable'], skipfooter=38)
df['Country'] = df['Country'].str.replace(r'(?:\s*\(.*\))?\d*$', '', regex=True)
在實際資料集上測驗,這給出了df['Country']:
[
'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra',
'Angola', 'Anguilla', 'Antigua and Barbuda', 'Argentina', 'Armenia',
'Aruba', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain',
'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin',
'Bermuda', 'Bhutan', 'Bolivia', 'Bonaire, Sint Eustatius and Saba',
'Bosnia and Herzegovina', 'Botswana', 'Brazil', 'British Virgin Islands',
'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cabo Verde',
'Cambodia', 'Cameroon', 'Canada', 'Cayman Islands', 'Central African Republic',
'Chad', 'Chile', 'China', 'China, Hong Kong Special Administrative Region',
'China, Macao Special Administrative Region', 'Colombia', 'Comoros', 'Congo',
'Cook Islands', 'Costa Rica', "C?te d'Ivoire", 'Croatia', 'Cuba', 'Cura?ao',
'Cyprus', 'Czech Republic', "Democratic People's Republic of Korea",
'Democratic Republic of the Congo', 'Denmark', 'Djibouti', 'Dominica',
'Dominican Republic', 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea',
'Eritrea', 'Estonia', 'Ethiopia', 'Faeroe Islands', 'Falkland Islands',
'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'Gabon',
'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland',
'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau',
'Guyana', 'Haiti', 'Honduras', 'Hungary', 'Iceland', 'India', 'Indonesia',
'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', 'Jamaica',
'Japan', 'Jersey', 'Jordan', 'Kazakhstan', 'Kenya', 'Kiribati', 'Kuwait',
'Kyrgyzstan', "Lao People's Democratic Republic", 'Latvia', 'Lebanon',
'Lesotho', 'Liberia', 'Libya', 'Liechtenstein', 'Lithuania', 'Luxembourg',
'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands',
'Martinique', 'Mauritania', 'Mauritius', 'Mexico', 'Micronesia', 'Mongolia',
'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia',
'Nauru', 'Nepal', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua',
'Niger', 'Nigeria', 'Niue', 'Northern Mariana Islands', 'Norway', 'Oman',
'Pakistan', 'Palau', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru',
'Philippines', 'Poland', 'Portugal', 'Puerto Rico', 'Qatar', 'Republic of Korea',
'Republic of Moldova', 'Réunion', 'Romania', 'Russian Federation', 'Rwanda',
'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Pierre and Miquelon',
'Saint Vincent and the Grenadines', 'Samoa', 'Sao Tome and Principe',
'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone',
'Singapore', 'Sint Maarten', 'Slovakia', 'Slovenia', 'Solomon Islands',
'Somalia', 'South Africa', 'South Sudan', 'Spain', 'Sri Lanka', 'State of Palestine',
'Sudan', 'Suriname', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
'Tajikistan', 'Thailand', 'The former Yugoslav Republic of Macedonia',
'Timor-Leste', 'Togo', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey',
'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu', 'Uganda', 'Ukraine',
'United Arab Emirates', 'United Kingdom of Great Britain and Northern Ireland',
'United Republic of Tanzania', 'United States of America', 'United States Virgin Islands',
'Uruguay', 'Uzbekistan', 'Vanuatu', 'Venezuela', 'Viet Nam',
'Wallis and Futuna Islands', 'Yemen', 'Zambia', 'Zimbabwe'
]
uj5u.com熱心網友回復:
通過鏈接正則運算式有一種非常簡單的方法。
s=[Some list of Countries with numbers and parentheses]
for i,x in enumerate(s):
s[i]=re.sub("[0-9]", "", (re.sub("\)","",(re.sub("\(", "", s[i])))))
或者
如果“s”是資料框“df”中的一列,
for i,each in df['s'].iteritems():
df.loc[i,'s'] = re.sub("[0-9]", "", (re.sub("\)","",(re.sub("\(", "", df.loc[i,'s'])))))
uj5u.com熱心網友回復:
您可以使用
import pandas as pd
import numpy as np
df = pd.DataFrame({'Country':['XXX(12)', 'YYYY5000', '(ZZZ)15', np.nan]})
df.loc[pd.isna(df['Country']), 'Country'] = ""
df['Country'] = df['Country'].astype(str).str.replace(r'[0-9()] ', '', regex=True)
df.loc[df['Country'] == '', 'Country'] = np.nan
這里,
df.loc[pd.isna(df['Country']), 'Country'] = ""- 將所有NaN值轉換為空字串.astype(str)- 將資料轉換為字串型別.str.replace(r'[0-9()] ', '', regex=True)- 洗掉所有數字(和)字符df.loc[df['Country'] == '', 'Country'] = np.nan- 將空字串轉換回NaN.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479802.html
上一篇:如何使用正則運算式選擇串列中的每個數字,但僅在一組特定字符之后?
下一篇:如何從日期字串中洗掉“,”
