dataframe的行索引方法有三种,分别为loc,iloc,ix
loc是基于行索引(index),或者说是行的名称进行索引的。比如如果说有自己认为设置了索引的名称,在进行检索时使用loc,就只能输入行的名称。但是如果index是默认的递增数,那么和iloc没有区别。
iloc是根据行的序列数索引的,序列数从0开始取,iloc前面的i就好像是在提醒你,他的输入参数是自然数。当然,在仅仅使用数字取列时,可以直接使用df[1]
的方法。
ix是前两者的混合,输入任何一种都可以。
这三种方式都支持对行列的检索和切片,组合起来可以有很丰富的用法。
dataframe的列索引比较简单一般可以使用df['cloumn']
的方式解决。至于如何输出多个列的值,有以下的方法;
print(data[['A','B']])
或者使用,这样可以取前400列。
data.iloc[:,0:400]
使用一些方法可是使得dataframe的输出对象满足你的条件:
import pandas as pd
import numpy as np
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
print(data)
print(data[data.A > 5])
结果为:
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
A B C D
c 8 9 10 11
d 12 13 14 15
当然你一可以采用更花哨的用法,比如找到某一列的最大的数:
print(data.loc[:,"A"].max())
也可以用这种方法对这个最大数进行修改:
data.loc[df["A"]==df.loc[:,"A"].max(),"A"] = 90
即是loc中,前面的是对行的条件,后面是对列的条件。
在遍历时求某个数据所在的行和列的均值,可以使用
for index,row in data.iterrows():
mean1 = data[data['number'] == row['number']].mean()#列均值
mean2 = data[data['time'] == row['time']].mean()
mean_row = row.mean()#行均值
思路是将dataframe的每一行变为单独的一行,此时的type为Series,原来的列名变为其索引index。如:
import pandas as pd
import numpy as np
# create a dataframe
table = pd.DataFrame(np.random.randn(3,2), index=["s1", "s2", "s3"], columns=["a1","a2"])
# 获得 s1 行
s1 = table.loc["s1",:]
# 获得 s1 中最大值的索引,可能有多个
s1_argmax = s1[s1 == s1.max()].index
# randomly choose 1 index
s1_argmax = np.random.choice(s1_argmax)
上面你的代码以行s1为例得到了最大值的列名,我们还可以通过对dataframe行的遍历得到每一行的最大值的列名:
import pandas as pd
import numpy as np
# create a dataframe
table = pd.DataFrame(np.random.randn(3,2), index=["s1", "s2", "s3"], columns=["a1","a2"])
print(table)
for index,row in table.iterrows():
temp = row[row == row.max()].index
table.loc[index,'label'] = np.random.choice(temp)
print(table)
或得输出:
a1 a2
s1 0.263149 1.433578
s2 -0.081885 0.592749
s3 -0.808727 0.944126
a1 a2 label
s1 0.263149 1.433578 a2
s2 -0.081885 0.592749 a2
s3 -0.808727 0.944126 a2
data_problem = total_data[~total_data['name'].isin([0,5])]
使用isin要注意: