2017-09-15 144 views
3

分開我的數據幀的象限考慮我的數據框df我怎樣才能通過零

df = pd.DataFrame(np.ones((4, 4), dtype=int), list('ABDE'), list('VWYZ')) 

df 

    V W Y Z 
A 1 1 1 1 
B 1 1 1 1 
D 1 1 1 1 
E 1 1 1 1 

我怎樣才能用零

V W X Y Z 
A 1 1 0 1 1 
B 1 1 0 1 1 
C 0 0 0 0 0 
D 1 1 0 1 1 
E 1 1 0 1 1 
+0

所以,沒有。 cols和rows總是偶數? – Divakar

+0

我怎麼知道你**會問這個問題?是!但我的解決方案並不需要它。 – piRSquared

+0

你知道偉大的思想..和他們對這些說什麼;) – Divakar

回答

1

創建新的索引和列值,然後reindex

a = int(len(df.columns)/2) 
cols =np.concatenate([df.columns[:a], ['X'], df.columns[a:]]) 
b = int(len(df.index)/2) 
idx =np.concatenate([df.index[:b], ['C'], df.index[b:]]) 

df = df.reindex(index=idx, columns=cols, fill_value=0) 
print (df) 
    V W X Y Z 
A 1 1 0 1 1 
B 1 1 0 1 1 
C 0 0 0 0 0 
D 1 1 0 1 1 
E 1 1 0 1 1 
+1

就是這樣!這個'f = lambda x,i:list(x [:len(x)// 2])+ [i] + list(x [len(x)// 2:])的派生函數。 df.reindex(f(df.index,'C'),f(df.columns,'X'),fill_value = 0)' – piRSquared

+0

Wau,謝謝。 – jezrael

+1

爲什麼不使用'insert'而不是'f'? – Zero

3
df['X'] = 0 
df.loc['C'] = [0]*len(df.columns) 
df = df.sort_index() 
df = df[[sorted(df.columns)]] 

我的數據框的象限分開,如果我不能分類標籤,然後:

df['X'] = 0 
col = list(df.columns) 
col.insert(len(col)/2,'X') 
df = df[col[:-1]] 
df.loc['C'] = 0 
rows = list(df.index) 
rows.insert(len(df)/2,'C') 
df.reindex(rows[:-1]) 
+1

自我解釋,但你濫用這裏的示例數據的結構,我不認爲這值得它的票數。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ是正確的。標籤可能已經完全不同。 – piRSquared

+0

用另一種方法編輯,但沒那麼高雅 –

4

一種醜陋的方式將

In [860]: df.insert(df.shape[1]/2, 'X', 0) 

In [861]: df.reindex(df.index.insert(df.shape[0]/2, 'C'), fill_value=0) 
Out[861]: 
    V W X Y Z 
A 1 1 0 1 1 
B 1 1 0 1 1 
C 0 0 0 0 0 
D 1 1 0 1 1 
E 1 1 0 1 1 

,從另一個靈感Divarkar的

In [897]: df.reindex(index=df.index.insert(df.shape[0]/2, 'C'), 
        columns=df.columns.insert(df.shape[1]/2, 'X'), fill_value=0) 
Out[897]: 
    V W X Y Z 
A 1 1 0 1 1 
B 1 1 0 1 1 
C 0 0 0 0 0 
D 1 1 0 1 1 
E 1 1 0 1 1 
+0

這在哲學上與我想的是一樣的。重新索引時,我使用了'fill_value = 0'參數。 – piRSquared

+0

關於排序...是的,確切地說。 – piRSquared

+0

同意!接受@jezrael,因爲我首先看到了索引和列的'reindex'。 – piRSquared

2

下面是一個使用數組創建的地方電網與np.ix_被插入 -

a = df.values 
m,n = a.shape 
mask_row = np.r_[:m//2+1,m//2-1:-1:-1] < m//2 
mask_col = np.r_[:n//2+1,n//2-1:-1:-1] < n//2 

out = np.zeros((m+1,n+1), dtype=a.dtype) 
out[np.ix_(mask_row, mask_col)] = a 
df_out = pd.DataFrame(out) 
df_out.columns = np.insert(df.columns, n//2, 'New') 
df_out.index = np.insert(df.index, m//2, 'New') 

取樣輸出 -

In [375]: df_out 
Out[375]: 
    V W New Y Z 
A 1 1 0 1 1 
B 1 1 0 1 1 
New 0 0 0 0 0 
D 1 1 0 1 1 
E 1 1 0 1 1 
+0

你是否建議mask比out = np.zeros((m + 1,n + 1),dtype = a.dtype)更好; out [m // 2] = 1; out [:, m // 2] = 1'? – Zero

+0

@JohnGalt你不需要需要四個這樣的切片分配步驟嗎? – Divakar

+0

爲什麼四個,兩個會做。這三條線足以產生最終的交叉數組。 – Zero