pandas删除行删除列,增加行增加列

df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('abcd'), index=['1', '2', '3', '4'])
print(df)
     a    b    c    d
1   0    1    2    3
2   4    5    6    7
3   8    9   10  11
4  12  13  14  15
 
1,根据列名称删除列
方法一,用del
     del df['b']  # 删除b列,好像无法删除多列
方法二,用drop,删除b,c列,下列三种方法等价
     df = df.drop(['b', 'c'], axis=1)  # 默认drop不会替换掉原df,即inplace为False
     df.drop(['b', 'c'], axis=1, inplace=True)  # inplace为True则直接替换掉了原df
     df.drop(df.columns[[1,2]], axis=1, inplace=True)
 
2,根据索引名称删除行
     df = df.drop(['1', '2'])   # 删除index为1和2的行,注意创建df时将index设置为str了,默认是int,还有2种等价方法参考列drop
 
3,根据value值删除行
     df= df[~df['b'].isin(['5', '9'])]  # 用bool筛选方法,删除b列中含有5,9的行
 
4,根据value值去重删除行
      df.loc['2','b']=9   #此时b列有2个含有9了,要去重删除一个
      df=df.loc[df['b'].drop_duplicates().index]
 
5,增加行
方法一,loc增加
     df.loc['5'] = [3, 3, 3, 3]
方法二,用set_value
     df.set_value('5', df.columns, [3,3,3,3], takeable=False)
备注:df增加行没找到类似insert这种(列有),可以插入行的方法,暂时替代方法:
    df.loc['5'] = [3, 3, 3, 3]
    df = df.reindex(index = list('12534'))
    或者:
    list = df.index
    df.loc['5'] = [3, 3, 3, 3]
    df = df.reindex(index = list.insert(2, '5')) 
 
6,df增加列
方法一:iloc遍历赋值
    有时可能需要遍历赋值,例如新增一列e,等于c列和d列值的和,这种方法能成功,但有 SettingWithCopyWarning告警,查了下貌似推荐用loc遍历
    df['e'] = np.NaN  # 需事先创建e列,否则iloc遍历会报错,loc遍历无需事先创建
    for i in range(len(df)):
         df['e'].iloc[i] = df['c'].iloc[i] + df['d'].iloc[i]
方法二:loc遍历赋值(推荐!!)
    for i in df.index:
        df.loc[i, 'e'] = df.loc[i, 'c'] + df.loc[i, 'd']
方法三:loc一次性赋值
     df.loc[:, 'e'] = [x + y for x, y in zip(df['c'], df['d'])]
     df.loc[['2', '3'], 'e'] = [3, 3]   # 也可以只选第2第3行复制
方法四:insert
    df.insert(0, 'e', [3, 3, 3, 3])   # 加在第一列
方法五:直接加
    df['e'] = [3, 3, 3, 3]    # 加在最后一列
方法六:其他
    增加3列,efg,value默认为np.NaN
    df = pd.concat([df, pd.DataFrame(columns=list('efg'))])   # 列的次序无法指定,并且fillna时会对整个df做出调整
    df = df.reindex(columns=list('abcdefg'),  fill_value=0)   # 列的次序按照list指定,并且fill_value只对新增列做出调整,推荐!
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/guxh/p/9420610.html