2017-09-19 27 views
1

我已經問過我的問題,但在描述中它不夠準確。 這個論壇上的聰明人已經提出瞭解決方案,但我忘了(抱歉)要精確地說,如果在相關列中有零,應該保留它們。如何(適用)根據索引或其他列選擇和複製數據框中的特定列

你好,我有一個像下面

   2014 2015 2016 2017 2018 2019 

     2014 10 20 30 40 0  5 
     2015 0  0 200 0 100  0  
     2016 0  0 200 140 35 10  
     2017 0  0  0  20  0 12  

我需要有這樣的結果的數據幀:

yearStart yearStart+1 yearStart+2 yearStart+3 yearStart+4 
0  10   20   30   40   0 
1  0   200    0   100   0  
2  200   140   35   10   0 
3  20   0    12   0   0 

的想法是每行中選擇,兩個日期之間的列:

索引和索引+增量,用delta參數(在本例中爲4)將它們放入數據幀中。

用iterrows(),它需要太多時間。

我試着用

df1 = df.apply(lambda x: pd.Series(x[x.keys()>=x.index],1)).fillna(0).astype(int) 

,但它不工作:

TypeError: ('Index(...) must be called with a collection of some kind, 
1 was passed', 'occurred at index 2014') 

謝謝

+0

的可能的複製[熊貓dataframe:如何複製別人的一些列根據行中的值](https://stackoverflow.com/questions/46283564/panda-dataframe-how-to-copy-some-columns-in-others-according-to-a-value-in-the ) – GPhilo

+0

你應該編輯你的第一個問題,澄清你的要求,而不是開一個與第一個問題基本相同的新問題。 – GPhilo

+1

抱歉,我是這個論壇的初學者。我爲我笨拙而道歉。無論如何謝謝你。有些零必須保留的事實讓我有理由認爲這是一個不同的情況。 – phil

回答

0

的方式之一,是

In [1010]: def yearmove(x): 
     ...:  idx = x.index.astype(int) 
     ...:  idx = idx - x.name 
     ...:  mask = idx >= 0 
     ...:  idx = 'yearStart' + idx.astype(str) 
     ...:  return pd.Series(x.values[mask], index=idx[mask]) 
     ...: 

In [1011]: df.apply(yearmove, 1).fillna(0).astype(int) 
Out[1011]: 
     yearStart0 yearStart1 yearStart2 yearStart3 yearStart4 yearStart5 
2014   10   20   30   40   0   5 
2015   0   200   0   100   0   0 
2016   200   140   35   10   0   0 
2017   20   0   12   0   0   0 
+0

Thak你。它完美地工作。如果我需要在時間窗持續時間上有條件,我寫 mask =(idx> = 0和idx <= delta) 但它回答 ValueError:('一個數組的真值元素是不明確的。使用a.any()或a.all()','發生在索引2015') – phil

+0

我意識到我的錯誤:'和'而不是'&',但'int'和用'&'操作符'int64'...我在跟蹤它 – phil

相關問題