2013-10-03 57 views
-2
  AES AIG AIV 
1/3/2008   1 
2/6/2008  1  
2/11/2008  1 1 


!cat dd.csv 
,AES,AIG,AIV 
1/3/2008 16:00,,1, 
2/6/2008 16:00,1,, 
2/11/2008 16:00,1,,1 

import pandas as pd 
import numpy as np 
s_input_file = 'dd1.csv' 
df = pd.read_csv(s_input_file, sep=',',header=0) #orders.csv 

def getcell(x): 
    if (x==1.0 and df.ix[x, df.ix[x]==1.0].values[0]==1.0): 
     print x, df.ix[x, df.ix[x]==1.0].index[0], df.ix[x][0] 

df.applymap(getcell) 

得到了正確的輸出的4個計數,但不是指右手食指ROW和COL 「如何打印行索引和列,其中細胞== 1?」如何使用熊貓DataFrame.applyMap方法

1.0 AES 2/6/2008 16:00 
1.0 AES 2/6/2008 16:00 
1.0 AES 2/6/2008 16:00 
1.0 AES 2/6/2008 16:00 

我怎樣才能獲得預期的輸出像這樣:

1/3/2008, AIG 
    2/6/2008, AES 
    2/11/2008, AES 
    2/11/2008, AIG 
+0

請澄清你的問題。特別是,你最終輸出的結果似乎並不是你想要的。 – cd98

+0

增加了預期的輸出 – Andrey

+0

在這個例子中,去掉空白不是最好的嗎? – Ryflex

回答

0

你正在嘗試與applymap做是行不通的,因爲參數是通過在單元格的值,您不知道該值來自哪一行或哪一列,因此您的代碼僅打印四次相同的值。

你想要做什麼是迭代在每一行和每一列,測試值NaN並打印索引值和列名

for index in df.index: 
    for col in df.columns: 
     if notnull(df.loc[index,col]): 
      print index, col 

# outputs 

1/3/2008 16:00 AIG 
2/6/2008 16:00 AES 
2/11/2008 16:00 AES 
2/11/2008 16:00 AIV 

也只是爲了批評你的代碼:

df = pd.read_csv(s_input_file, sep=',',header=0) #orders.csv 
# the above can be changed to the more compact 
df = pd.read_csv(s_input_file) # sep and header have default values that will work for you 

def getcell(x): 
    if (x==1.0 and df.ix[x, df.ix[x]==1.0].values[0]==1.0): 
        ^well this does not do what you think 

您正在嘗試使用索引,但.ix你得到的是單元格的值,因此這將是NaN1.0所以它是錯的,你應該使用.loc的標籤索引或基於整數索引的。另外,我不確定爲什麼使用df.ix[x]==1.0]執行價值比較,然後致電.values[0]=1.0 ??

 print x, df.ix[x, df.ix[x]==1.0].index[0], df.ix[x][0] 

與上面的代碼又是什麼.ix正在做正在這裏所做的你只是打印在同一行,每次不正確的假設。