从项目列表中创建特定形状的熊猫数据框

时间:2019-05-21 23:40:42

标签: python arrays pandas list

我有一个特定尺寸的熊猫数据框,说:

   ID  FACTOR    LEVEL
  160  SPM       P                       
  159  SPM2      S                         
  851  ABS       K                        
  415  ABS       P                       
  202  ABS       P 
  205  ABS2      Q
  207  AQE       T 

我想做的是列出两个项目:  X = ['GAB','YER']

所以我想做的是,我想将此项目作为新列(如NewCol)分配到列表中,并以与数据帧中行大小相同的特定频率进行分配。因此,在这种情况下,我有7行和2项,而7/2整数商为3,因此我想将第一个项放在3行中,而将下一个放在其余4行中。因此输出应为:

         ID  FACTOR    LEVEL  NewCol
        160  SPM       P        GAB               
        159  SPM2      S        GAB                 
        851  ABS       K        GAB               
        415  ABS       P        YER               
        202  ABS       P        YER
        205  ABS2      Q        YER
        207  AQE       T        YER

到目前为止,我能做的就是使用

创建一系列的两个元素
 df_s = pd.DataFrame(X)

这给了我

     0
    GAB
    YER

但是,我无法用带有X中值的数据框形状来以此创建系列,也无法找到分配它的方法。我仍在努力中,但请您多多指教。

2 个答案:

答案 0 :(得分:3)

使用np.repeat并将结果分配到新列:

arr = np.repeat(X, len(df) // len(X))
df['NewCol'] = pd.Series(arr, index=df.index[:len(arr)])
df

    ID FACTOR LEVEL NewCol
0  160    SPM     P    GAB
1  159   SPM2     S    GAB
2  851    ABS     K    GAB
3  415    ABS     P    YER
4  202    ABS     P    YER
5  205   ABS2     Q    YER
6  207    AQE     T    NaN

如果要填充最后一个NaN,请使用

df['NewCol'] = df['NewCol'].ffill()

答案 1 :(得分:2)

使用clip

的一些不同想法
import numpy as np 
n=len(X)
m=len(df)//n 
s=pd.Series(np.arange(len(df))//m).clip_upper(n-1)
df['New']=s.map(dict(zip(s.unique(),X)))
df
Out[278]: 
    ID FACTOR LEVEL  New
0  160    SPM     P  GAB
1  159   SPM2     S  GAB
2  851    ABS     K  GAB
3  415    ABS     P  YER
4  202    ABS     P  YER
5  205   ABS2     Q  YER
6  207    AQE     T  YER