2016-11-30 4 views
1

У меня есть dataframe, который выглядит следующим образом:заполнения колонки dataframe одинаково

ID Name 
1  Missing 
2  Missing 
3  Missing 
....... 

Есть ли способ, в котором я мог бы заполнить имя столбца в равной степени (+1), если Len (ДФ) неровная с количество имен, которые я сохранил (список или словарь). Для Ex, если у меня есть 2 имени. Половина столбца будет Name1, а другая половина будет Name2. Я пробовал:

for i in (range(len(df)/no_names)): 
    counter=0 
    df.ix[i]['Name'] = dictionary.values()[0] 

но это заполнить бы в только мои первые N строк на основе сколько имен у меня есть.

ответ

1

моя первая попытка на вопросы python, это определенно не самое эффективное решение.

import pandas as pd 
df = pd.DataFrame({'a':[1,4,4,0,4,0,4,0],'b':[2,1,4,0,4,0,4,0]}) 
#df 
#Out[76]: 
# a b 
#0 1 2 
#1 4 1 
#2 3 3 
#3 4 4 
#4 0 0 
#5 4 4 
#6 0 0 
#7 4 4 
#8 0 0 

на основе длины каждого столбца, повторите Name1 и Name2 соответственно

df['new'] = np.repeat(np.array(["A", "B"]), repeats=[round(df.shape[0]/2), df.shape[0]-round(df.shape[0]/2)]) 

#Out[81]: 
# a b new 
#0 1 2 A 
#1 4 1 A 
#2 3 3 A 
#3 4 4 A 
#4 0 0 B 
#5 4 4 B 
#6 0 0 B 
#7 4 4 B 
#8 0 0 B 
2

Вы можете использовать

import numpy as np 
N = len(df) 
df['Name'] = np.array(['Name1', 'Name2'])[np.linspace(0,2,N,endpoint=False).astype(int)] 

Идея заключается в том, чтобы создать массив 0-х и 1, например

In [34]: np.linspace(0,2,11,endpoint=False).astype(int) 
Out[34]: array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) 

Теперь мы можем использовать NumPy индексацию, чтобы создать массив значений «Имя2» «name1» и:

In [8]: np.array(['Name1', 'Name2'])[np.linspace(0,2,11,endpoint=False).astype(int)] 
Out[8]: 
array(['Name1', 'Name1', 'Name1', 'Name1', 'Name1', 'Name1', 'Name2', 
     'Name2', 'Name2', 'Name2', 'Name2'], 
     dtype='<U5') 
+0

Это милостивый феноменально. –

+0

Используя ваш метод unutbu, у меня есть результат, но при печати DataFrame я получаю сообщение об ошибке: значение пытается быть установлено на копии среза из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо Добавление iloc doens't решить его, наоборот, нет результата для моей печати –

+0

Это предупреждение - я считаю, что это UserWarning, а не исключение - это говоря, что 'df' является * копией * фрагмента другого DataFrame. Предупреждение существует из-за чрезмерной осторожности, чтобы предупредить вас о том, что изменение 'df' может не повлиять на исходный DataFrame. Если это не ваше намерение, вы можете игнорировать UserWarning. См. Http://stackoverflow.com/q/40033471/190597 для получения дополнительной информации и способов отключения пользовательской рекламы. – unutbu

 Смежные вопросы

  • Нет связанных вопросов^_^