2017-05-03 14 views
2

の列での作業:これは私が持っているテーブルの一部であるパンダ

type n_b 
sp  2 
sp  2 
sp  3 
avn 2 
avn 4 
avn 3 
psp 1 
psp 3 
psp 5 
... 

また、私は、データセットがあります。

d = pd.Series({'sp':['98,00', '0,00', '68,00'], 'psp':['17,00', '7,60', '14,30'], 
      'avn':['15,00', '10,00', '4,30']}) 

を、私は私のデータセットから値と一致する必要がありますカラム "type"の値に応じて新しいカラム "c_t"に挿入します。つまり、結果がどうあるべきかです:

type n_b c_t 
sp  2 98,00 
sp  2  0,00 
sp  3 68,00 
avn 2 15,00 
avn 4 10,00 
avn 3  4,30 
psp 1 17,00 
psp 3  7,60 
psp 5 14,30 
... 

は私のコードは次のようになります。

d = pd.Series({'sp':['98,00', '0,00', '68,00'], 'psp':['17,00', '7,60', '14,30'], 
      'avn':['15,00', '10,00', '4,30']}) 

df['c_t'] = df['type'].map(d) 
print (df) 

しかし、私はそれ

type n_b c_t 
sp  2 [98,00, 0,00, 68,00] 
sp  2 [98,00, 0,00, 68,00] 
sp  3 [98,00, 0,00, 68,00] 
avn 2 [15,00, 10,00, 4,30] 
avn 4 [15,00, 10,00, 4,30] 
avn 3 [15,00, 10,00, 4,30] 
psp 1 [17,00, 7,60, 14,30] 
psp 3 [17,00, 7,60, 14,30] 
psp 5 [17,00, 7,60, 14,30] 
... 

私はこれをどのように修正することができます必要があるとして、それは動作しませんか?

UPD:実際には、ファイル内のより多くのデータがある

d1 = pd.Series({'ds':['104,50', '19,00', '10,00', '30,00', '0,00', '0,00', '16,00', '21,50'], 
      'zkp':['33,00', '100,00', '16,00', '3,30', '9,00', '0,00', '0,00', '0,00', '4,80', '78,50'], 
      'dgv':['96,00', '0,00', '194,50', '61,00', '0,00', '10,00', '0,00', '28,00', '0,00', '0,00', 
         '11,00', '30,00', '0,00', '0,00', '0,00', '16,00', '78,50'], 'sp':['98,00', '0,00', '68,00'], 
      'psp':['17,00', '7,60', '14,30'],'avn':['15,00', '10,00', '4,30']}) 

、テーブルが巨大である:

type n_b Day_number 
ds  2  1 
ds  3  2 
ds  1  3 
ds  2  4 
ds  1  5 
ds  3  6 
ds  2  7 
ds  1  8 
sp  2  1 
sp  2  2 
sp  1  3 
avn 2  1 
avn 4  2 
avn 3  3 
psp 1  1 
psp 3  2 
psp 5  3 
sp  2  1 
sp  2  2 
sp  4  3 
... 

そして、すべてのタイプ(DS、ZKP、DGV、SP、PSP 、avn)がファイルにあります。列「n_b」は列「c_t」に影響しません。 「Day_number」欄には、その日の番号が表示されます。

、結果は以下のようになります。

type n_b Day_number  c_t 
ds  2  1   104,50 
ds  3  2   19,00 
ds  1  3   10,00 
ds  2  4   30,00 
ds  1  5    0,00 
ds  3  6    0,00 
ds  2  7   16,00 
ds  1  8   21,50 
sp  2  1   98,00 
sp  2  2    0,00 
sp  1  3   68,00 
avn 2  1   15,00 
avn 4  2   10,00 
avn 3  3    4,30 
psp 1  1   17,00 
psp 3  2    7,60 
psp 5  3   14,30 
sp  2  1   98,00 
sp  2  2    0,00 
sp  4  3   68,00 
... 
+0

は、データセットの配置またはそれは常にだけであることを行っている上の任意のベアリングを持っているN_Bいそれがシリーズに現れる順序?そして、常に3つのタイプが並んでいますか? – pshep123

+0

いいえ、列「n_b」はデータの配置には影響しません。行の型の数は異なる場合があります。しかし、私はそれを前もって定義しています。私は、私に例があれば、他の価値観でそれをすることができると思っただけです。 –

答えて

1

あなたはその後、dfcumcount、最後joinでグループごとに固有の値を持つヘルパー列gを作成し、lists最初からDataFrameを作成することができます。

#get lenghts of lists 
l = d.str.len() 
#repeat index values by lengths 
r = np.repeat(d.index.values, l) 
#flattening lists 
v = np.concatenate(d.values) 
#DataFrame constructor 
df1 = pd.DataFrame({'type':r, 'c_t':v}) 
print (df1) 
    c_t type 
0 15,00 avn 
1 10,00 avn 
2 4,30 avn 
3 17,00 psp 
4 7,60 psp 
5 14,30 psp 
6 98,00 sp 
7 0,00 sp 
8 68,00 sp 

df1['g'] = df1.groupby('type').cumcount() 
df['g'] = df.groupby('type').cumcount() 

df = df.join(df1.set_index(['type','g']), on=['type','g']).drop('g', axis=1) 
print (df) 
    ype n_b c_t 
0 sp 2 98,00 
1 sp 2 0,00 
2 sp 3 68,00 
3 avn 2 15,00 
4 avn 4 10,00 
5 avn 3 4,30 
6 psp 1 17,00 
7 psp 3 7,60 
8 psp 5 14,30 

編集:

d1 = pd.Series({'ds':['104,50', '19,00', '10,00', '30,00', '0,00', '0,00', '16,00', '21,50'], 
      'zkp':['33,00', '100,00', '16,00', '3,30', '9,00', '0,00', '0,00', '0,00', '4,80', '78,50'], 
      'dgv':['96,00', '0,00', '194,50', '61,00', '0,00', '10,00', '0,00', '28,00', '0,00', '0,00', 
         '11,00', '30,00', '0,00', '0,00', '0,00', '16,00', '78,50'], 'sp':['98,00', '0,00', '68,00'], 
      'psp':['17,00', '7,60', '14,30'],'avn':['15,00', '10,00', '4,30']}) 

#get lenghts of lists 
l = d1.str.len() 
#repeat index values by lengths 
r = np.repeat(d1.index.values, l) 
#flattening lists 
v = np.concatenate(d1.values) 
#DataFrame constructor 
df1 = pd.DataFrame({'type':r, 'c_t':v}) 
df1['g'] = df1.groupby('type').cumcount() + 1 

df = df.join(df1.set_index(['type','g']), on=['type','Day_number']) 
print (df) 
    type n_b Day_number  c_t 
0 ds 2   1 104,50 
1 ds 3   2 19,00 
2 ds 1   3 10,00 
3 ds 2   4 30,00 
4 ds 1   5 0,00 
5 ds 3   6 0,00 
6 ds 2   7 16,00 
7 ds 1   8 21,50 
8 sp 2   1 98,00 
9 sp 2   2 0,00 
10 sp 1   3 68,00 
11 avn 2   1 15,00 
12 avn 4   2 10,00 
13 avn 3   3 4,30 
14 psp 1   1 17,00 
15 psp 3   2 7,60 
16 psp 5   3 14,30 
17 sp 2   1 98,00 
18 sp 2   2 0,00 
19 sp 4   3 68,00 
+0

ありがとうございました!しかし、コードは1つの値に対してのみ機能しています。他の行にはNaNがあります。それを修正することが可能かどうか? –

+0

1つの値?わかりません。あなたはそれを説明できますか? – jezrael

+0

私は質問を更新しました。私の場合は、最初の値 'dgv'に対してのみ機能します。つまり、コラム "C_Tは" 次のようになりますさ:96,00 0,00 194,50 61,00 0,00 10,00 0,00 28,00 0,00 0、 00 11,00 30,00 0,00 0,00 0,00 16,00 78,50 NaNの NaNの のNaN と理解していればそう –

1

あなたがほとんどそこにいるようです。あなたは今持っている:あなたは所望の出力を得るために

df 
Out[758]: 
    type n_b     c_t 
0 sp 2 [98,00, 0,00, 68,00] 
1 sp 2 [98,00, 0,00, 68,00] 
2 sp 3 [98,00, 0,00, 68,00] 
3 avn 2 [15,00, 10,00, 4,30] 
4 avn 4 [15,00, 10,00, 4,30] 
5 avn 3 [15,00, 10,00, 4,30] 
6 psp 1 [17,00, 7,60, 14,30] 
7 psp 3 [17,00, 7,60, 14,30] 
8 psp 5 [17,00, 7,60, 14,30] 

一歩を:

#use the row index%3 to select the element from the list under c_t column. 
df.c_t=df.apply(lambda x: x.c_t[x.name%3],axis=1) 

df 
Out[761]: 
    type n_b c_t 
0 sp 2 98,00 
1 sp 2 0,00 
2 sp 3 68,00 
3 avn 2 15,00 
4 avn 4 10,00 
5 avn 3 4,30 
6 psp 1 17,00 
7 psp 3 7,60 
8 psp 5 14,30 
関連する問題