pandas选择单元格,新增行新增列

时间:2021-02-06 15:49:52

 

     A    B    C    D

5  A0  B0  C0  D0

6  A1  B1  C1  D1

7  A2  B2  C2  D2

8  A3  B3  C3  D3

 

1,直接中括号[]选取

     df['A']            选择第A列,是一个series,选择多列不能df['A','B'],必须用loc

     df['A'][5]        选择第A列,索引为5的,即A0

     df['A'].iloc[0]  = df['A'].values[0]     选择第A列第1行,即A0   

     df[0:3]           选择前2行,即索引为5和6的行

     df['6':'8']        选择索引为6,7,8的行

 

2loc获取,通过index或者columns名称选取

     df.loc['5']        索引为5的行 即A0  B0  C0  D0

     df.loc[:,['A','B']]    选择A和B列

     df.loc['5',['A','B']]        索引为5,列号为A和B的数据,可以赋列表

     df.loc['5','A']   访问index为5,columns为A的单元格

     df.at['5','A']   同loc速度快点

     df里逐行添加内容时,可以用df.loc[index_name] = [list]

     例如:逐行爬取豆瓣电影数据:df.loc[str(len(df)+1)] = [list],这种方法需要事先确定要columns

 

3iloc获取,通过行号或者列号选取

     df.iloc[1]       第1行,索引为5的行 即A0  B0  C0  D0

     df.iloc[0:2,0:2]  第1,2行,第1,2列

     df.iloc[1,1]   访问1行1列的单元格

     df.iat[1,1]   同iloc速度快点

     df.iloc[0:-1, 3]  第3列所有数据

 

4,获取索引名

     df.iloc[1].name   获取到第2行的索引名,即6

     可以是index = df[df['A'] == 5].index  # 此时返回的是Int64Index,用此index取数据会取到sereis

     可以是index = df[df['A'] == 5].index.tolist()  # 此时返回的是list,加个[0]后可以取到第一个元素的int

 

5,选择一批行

     list=[6,7]

     df.loc[list]      获取索引为6和7的行

 

6,重新根据index选择数据

    result.reindex(index=list)  

 

新增列:

方法一:.iloc:

1)iloc遍历赋值:如果已经有'A'列,可以用df['A'].iloc[5] = '77' , 即A列的第6行的值=77

2)iloc遍历赋值没有'A'列时:如果没有'A'列,上述赋值会出错,可以先添加个'A'列,即df['A'] = np.nan,再df['A'].iloc[5] = '77'

方法二:.loc

1).loc遍历赋值:如果是df.loc[5, 'A'] = 77, 即索引为5,列名为A的,赋值=77,则不管有没有'A'列都能成功,不存在的index和column会自动创建

2).loc一次性赋值:可以应用布尔series赋给同一个值,例如df.loc[series, 'A'] = 'yes',即series中是True的,列名为'A'的,就会被赋值为yes

3).loc一次性赋值:整列赋一个列表,table1_sub.loc[:,'A'] = list  ,直接给A列赋一个列表

方法三:insert

df.insert(0, 'A', listA),注意list需要与df长度一致

方法四:直接加

1)直接加一列:df['A'] = None,默认是加在最后一列, 如果想加在第一列,可以df.insert(0, 'A', ['']*len(df))

2)直接加多列:df = pd.concat([df, pd.DataFrame(columns=list('DE'))]),列的次序无法指定,并且fillna时会对整个df做出调整

3)直接加多列:df = df.reindex(columns=list('ABCDE'), fill_value=0),列的次序按照list指定,并且fill_value只对新增列做出调整,推荐!

 

新增行:

.loc:

1)整行赋一个列表:df.loc[index_name] = [list]

 

遍历一个dataframe,又有多个series,需要用到.loc赋值时,可以使用:

for index, element in enumerate(zip(df['a'], df['b'])):

  df.loc[index, 'A'] = xxx

 

遍历一个dataframe,可以直接使用index配合loc,遍历所有列项:

for index in df.index:

  df.loc[index, 'A'] ……..