-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 个输出计数,但没有引用正确的索引行和列“如何打印单元格 == 1 的行索引和列?”

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
4

1 回答 1

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但您得到的是单元格的值,NaN因此1.0它将是错误的,您应该.loc用于标签索引或.iloc基于整数的索引。另外我不确定你为什么使用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再次使用上面的代码,对这里所做的事情的错误假设,您每次只打印同一行。

于 2013-10-04T08:37:03.650 回答