Вот мой текущий dataframe:Как создать новые столбцы в dataframe из строки другого столбца?
>>>df = {'most_exhibitions' : pd.Series(['USA (1) Netherlands (5)' ,
'United Kingdom (2)','China (3) India (5) Pakistan (8)','USA (11) India (4)'], index=['a', 'b', 'c','d']),
'name' : pd.Series(['Bob', 'Joe', 'Alex', 'Bill'], index=['a', 'b', 'c','d'])}
>>> df
name most_exhibitions
a Bob USA (1) India (5)
b Joe United Kingdom (2)
c Alex China (3) India (5) USA (8)
d Bill USA (11) India (4)
Я пытаюсь выяснить, как разделить каждую ячейку, а затем, возможно, создать новый столбец из страны и поместить соответствующее количество в правом ряду. Если страна уже является существующим столбцом, я хочу просто поместить счет в правый ряд.
Таким образом, окончательный dataframe будет выглядеть следующим образом:
# name most_exhibitions USA United Kingdom China India
#a Bob USA (1), India (5) 1 5
#b Joe United Kingdom (2) 2
#c Alex China (3), India (5), USA (8) 8 3 5
#d Bill USA (11), India (4) 11 4
Я хотел написать цикл или функцию, которая будет разделить данные, а затем добавить новый столбец, но я не мог понять, как сделай это. Я закончил разделение и очистку данных с помощью серии словарей, и теперь я застрял в том, как сделать последний словарь в его собственной информационной кадре. Я думаю, если я смогу сделать эту новую фреймворк данных, я смогу добавить ее к старой. Я также думаю, что делаю это сложнее, чем должно быть, и я заинтересован в любых более элегантных решениях.
Вот что я сделал до сих пор:
>>>country_rank_df['country_split']
= indexed_rankdata['most_exhibitions'].str.split(",").astype(str)
from collections import defaultdict
total_dict = defaultdict(list)
dict2 = defaultdict(list)
dict3 = defaultdict(list)
dict4 = defaultdict(list)
dict5 = defaultdict(list)
dict6 = defaultdict(list)
for name, country_count in zip(head_df['name'], head_df['most_exhibitions']):
total_dict[name].append(country_count)
for key, value in total_dict.iteritems():
for line in value:
new_line = line.split('(')
dict2[key].append(new_line)
for key, list_outside in dict2.iteritems():
for list_inside in list_outside:
for value in list_inside:
new_line = value.split(',')
dict3[key].append(new_line)
for key, list_outside in dict3.iteritems():
for list_inside in list_outside:
for value in list_inside:
new_line = value.split(')')
dict4[key].append(new_line)
for key, list_outside in dict4.iteritems():
for list_inside in list_outside:
for value in list_inside:
new_line = value.strip()
new_line = value.lstrip()
dict5[key].append(new_line)
for key, list_outside in dict5.iteritems():
new_line = filter(None, list_outside)
dict6[key].append(new_line)
>>>dict6['Bob']
[['USA',
'1',
'India',
'5']]
спасибо @jezrael. Когда я пытаюсь сделать следующее: 'name_exhibitions_df_2 ['most_exhibitions'] = name_exhibitions_df_2 ['most_exhibitions']. Str.rsplit ('', n = 1) .str [0]', я получаю эту ошибку: 'AttributeError: ' Объект StringMethods не имеет атрибута 'rsplit''. Знаете ли вы, почему это так? Я использую Python 2.7.8 и iPython 2.1.0. –
Эта ошибка с вашим образцом? какая версия панд использует 'print pd .__ version__'? – jezrael
Спасибо, что помогли так быстро. Да, это не работает с моим образцом. Версия 0.14.0 –