2017-09-15 27 views
2

數據數據幀:交織0柱

A B 
0 a d 
1 b NaN 
2 c c 
3 d f 

我怎麼可能交織A和B之間0柱?我想獲得:

A X B 
0 a 0 d 
1 b 0 NaN 
2 c 0 c 
3 d 0 f 

同樣,對於這一點:

A B C 
0 a d e 
1 b NaN a 
2 c c f 
3 d f g 

我想:

A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 

我怎樣才能做到這一點?

你可以在下面找到我的嘗試。我想知道其他的,可能更短/更有效/古怪的做法。

回答

3

選項0

df.reindex_axis([x for y in lst for x in [y, 'X']][:-1], 1, fill_value=0) 

    A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 

選項1分
字符串兩輪牛車
其實,@約翰高爾特打我這一個。

df.reindex_axis('|X|'.join(df).split('|'), 1, fill_value=0) 

    A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 

選項2
使用cytoolz.interleave
@root據悉here

from cytoolz import interleave 

df.reindex(
    columns=list(interleave([df, list('X' * (df.shape[1] - 1))])), 
    fill_value=0) 

    A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 
+0

'cytoolz'方法幾乎是作弊,它非常酷。 –

+0

這是一個黑客和@cᴏʟᴅsᴘᴇᴇᴅ是OP,所以他很聰明,弄清楚( - : – piRSquared

1

我在與df.reindex溶液嘗試:

def foo(cols): 
    yield cols[0] 
    for c in cols[1:]: 
     yield from ('X', c) 

df1.reindex(columns=foo(df1.columns), fill_value=0) 

    A X B 
0 a 0 d 
1 b 0 NaN 
2 c 0 c 
3 d 0 f 
4

1)一種方式來構造列

In [916]: df.reindex(columns=sum([[c, 'X'] for c in df.columns], [])[:-1], fill_value=0) 
Out[916]: 
    A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 

In [917]: sum([[c, 'X'] for c in df.columns], [])[:-1] 
Out[917]: ['A', 'X', 'B', 'X', 'C'] 

2)另一種方式來構造

In [924]: def mixcols(cols): 
    ...:  ncols = ['X'] * 2 * len(cols) 
    ...:  ncols[0::2] = cols 
    ...:  return ncols[:-1] 

In [925]: mixcols(df.columns) 
Out[925]: ['A', 'X', 'B', 'X', 'C'] 

In [926]: df.reindex(columns=mixcols(df.columns), fill_value=0) 
Out[926]: 
    A X B X C 
0 a 0 d 0 e 
1 b 0 NaN 0 a 
2 c 0 c 0 f 
3 d 0 f 0 g 

3)從@piR

In [944]: [c for cx in zip(df.columns, ['X']*len(df.columns)*2) for c in cx][:-1] 
Out[944]: ['A', 'X', 'B', 'X', 'C'] 

也激發

In [939]: from itertools import chain, izip 

In [940]: list(chain.from_iterable(izip(df.columns, ['X']*len(df.columns)*2)))[:-1] 
Out[940]: ['A', 'X', 'B', 'X', 'C'] 

4)不推薦方式

In [935]: '-|-X-|-'.join(df.columns).split('-|-') 
Out[935]: ['A', 'X', 'B', 'X', 'C'] 
+1

我只注意到你的** 4)**( - :再偉大的人! – piRSquared

+0

爲什麼'4)'不是推薦的方式? – Dark

+1

如果你可以保證現有的列名不包含split delim' - | -',那麼沒關係,但你不能總是這樣。 – Zero