Python 如何用零分隔数据帧的象限

Python 如何用零分隔数据帧的象限,python,pandas,numpy,Python,Pandas,Numpy,考虑我的数据帧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

考虑我的数据帧
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
如果我无法对标签进行排序,则:

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])
一种丑陋的方式是

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
,另一个灵感来自迪瓦卡的

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

这里有一个数组,它创建了一个位置网格,可以用
np.ix\uu
-

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')

创建新的索引和列值,然后:


所以,列数和列数总是偶数?我怎么知道你会问这个?对但我的解决方案并不需要它。你知道伟大的头脑。。不管他们怎么说;)这在哲学上和我的想法是一样的。我在重新索引时使用了
fill\u value=0
参数。关于排序。。。没错,同意!首先接受@jezrael,正如我所看到的
reindex
索引和列。不言而喻,但您滥用了这里的示例数据结构,我认为这不值得它拥有的投票数。@cᴏʟᴅsᴘᴇᴇᴅ 这是正确的。标签可能完全不同。用另一种方法编辑,但不是那么优雅。你认为mask比
out=np.zeros((m+1,n+1),dtype=a.dtype)好吗;out[m//2]=1;out[:,m//2]=1
?@JohnGalt您不需要四个这样的切片分配步骤吗?为什么四个,两个就可以了。这三行足够生成带有交叉的最终输出数组。@JohnGalt所以,这给了我们
out
作为最终数组输出(倒tho),但假设原始数据帧都是1?嗯,我现在明白了,至少这里OP都是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)
为什么不使用
insert
而不是
f
?我只是想说@JohnGalt在索引上使用insert更好。
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
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