2016-11-30 47 views
1

我有一个数据帧,看起来如下:填充数据框柱同样

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

有没有一种方式,我可以在列名填写同样(+1)如果len(DF)是不均匀的用我存储的名称数(一个列表或一个字典)。例如,如果我有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 

根据每列的长度,重复NAME 1和NAME相应

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的索引创建“名称1”和“名称2”值的数组:

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的切片副本上设置。 尝试使用.loc [row_indexer,col_indexer] =值代替 添加iloc doens't解决它,相反没有结果我的打印 –

+0

此警告 - 我相信这是一个UserWarning,而不是一个例外 - 是说'df'是另一个DataFrame片段的*副本*。警告在那里,请大家注意,修改'df'可能不会影响原始的DataFrame。如果这不是你的意图,你可以忽略UserWarning。请参阅http://stackoverflow.com/q/40033471/190597了解更多信息和沉默UserWarning的方法。 – unutbu