笔记:DataFrame对于行列的增加、修改和删除

目录

一、列

(一)增加列:

1.直接 df['new_column']=xx:

2.使用 df.insert(loc, column, value, allow_duplicates = False) 函数

(二)修改列

1.更改列的名

2.更改列的值

(三)删除列

1.del:

2.drop:

二、行

(一)增加行

(二)删除行

1.df.drop[ ]

(三)修改行

1.修改行名:

2.修改行值:


一、列

(一)增加列:

1.直接 df['new_column']=xx:

比如在数据最后后面多加一列成交率:

print(data2.head(3))
data2['成交率']=data2['客单数']/data2['客流量']
print(data2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份    门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1   龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1   石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1   观澜店


          日期 星期   门店号           码洋   天气  ...  客单数  交易数量  月份    门店  成交率
0 2023-01-31  二  1001  8105.611548  NaN  ...  859  2004   1   龙华店  0.544705
1 2023-01-31  二  1002  8117.412956  NaN  ...  752  1462   1   石岩店  0.540230
2 2023-01-31  二  1003  9369.565960  NaN  ...  949  1258   1   观澜店  0.571343

2.使用 df.insert(loc, column, value, allow_duplicates = False) 函数

  • loc:插入列的索引,从0开始
  • column:列名
  • value:插入列的值,定值或 Series以及列表等(pycharm里提示这里是HASHABLE可被定位的,即有序的),Series型数据插入pandas 会使用索引对齐,未定位的索引为空
  • allow_duplicates:列名存在时,该参数为 TRUE 才能继续插入,否则报错

比如,我想在根据日期在第二列加一列 season:

print(data2.head(3))

season_col=[]
for i in range(len(data2)):
    if data2['日期'].dt.month[i]>=1 and data2['日期'].dt.month[i]<=3:
        season_col.append(1)
    elif data2['日期'].dt.month[i]>3 and data2['日期'].dt.month[i]<=6:
        season_col.append(2)
    elif data2['日期'].dt.month[i] > 6 and data2['日期'].dt.month[i] <= 9:
        season_col.append(3)
    elif data2['日期'].dt.month [i]> 9 and data2['日期'].dt.month[i] <= 12:
        season_col.append(4)
data2.insert(1,'season',season_col)

print(data2.head(3))


          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期  season 星期   门店号           码洋  ...   客流量  客单数  交易数量  月份   门店
0 2023-01-31       1  二  1001  8105.611548  ...  1577  859  2004   1  龙华店
1 2023-01-31       1  二  1002  8117.412956  ...  1392  752  1462   1  石岩店
2 2023-01-31       1  二  1003  9369.565960  ...  1661  949  1258   1  观澜店

(二)修改列

1.更改列的名

(1)df.column=['column1','column2',...]

        这种方法可以对所有列名进行修改,要求列表内的长度与旧列名的长度一致

(2)df.rename(columns={'oldname1':'newname1','oldname2':'newname2'},inplace=FALSE/TURE})

        这种方法可以只对某些列名修改,inplace=True时会在原Datafram上进行更改,rename 也可以修改 axis 参数用于修改行索引

(3)也可以在导数据的时候直接采用新的列名,避免混乱目前只需要知道这几种就好

2.更改列的值

(1)df['column']=value,类似直接增加列的方法,赋值

        可以将某列修改为定值,或利用 list/array 进行修改,以及Series和DataFrame可以修改,但需要索引对齐,否则会出错(不报错,全为空)

print(data2.head(3))
data2['天气']='晴'
print(data2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋 天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  晴  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  晴  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  晴  9369.565960  1661  949  1258   1  观澜店

(2)利用df.replace(to_replace,value,inplace,...):可进行部分数据的更改

        to_replace:确定需要修改列值的数据。可接受的数据类型有:str, regex, list, dict, Series, int, float, or None
        value:指定修改后的值。可接受的数据类型有:scalar, dict, list, str, regex, default None
        inplace:是否本地置换
        limit:指定前后填充的最大次数
        regex:正则表达式符号。如果在to_replace中使用字符串形式的正则表达式对数据进行筛选的时候,需要将其设置为True。
        method:填充方式。‘pad’, ‘ffill’, ‘bfill’, None

print(data2.head(3))
data2['月份'].replace(1,'01',inplace=True)
print(data2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004  01  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462  01  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258  01  观澜店

(3)筛选满足条件的值修改,数据的筛选查找日后专门出一篇文章总结一下

(三)删除列

1.del:

        del删除列会直接改变原 DataFrame

print(data2.head(3))
del data2['天气']
print(data2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  9369.565960  1661  949  1258   1  观澜店

2.drop:

        dt.drop(labels = ['column1','column2'], axis = 1,inplace =FALSE),在 inplace=TRUE 时,会修改原DataFrame

print(data2.head(3))
df=data2.drop(labels = ['天气','码洋'], axis = 1)    # 将删除列后的数据赋给df
print(data2.head(3))    # 未改变
print(df.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  1661  949  1258   1  观澜店

二、行

(一)增加行

1.df.loc[index]=[ ]

print(data2.tail(3))
print(len(data2))
data2.loc[len(data2)]=['2023-04-02','日','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN']
data2.info()

             日期 星期   门店号           码洋   天气  ...   客流量  客单数  交易数量  月份   门店
4265 2023-04-01  六  3008   383.240643  NaN  ...  1591  649  1363   4  惠州店
4266 2023-04-01  六  3009  5739.039035  NaN  ...  1443  901  2294   4  佛山店
4267 2023-04-01  六  3010  9178.243621  NaN  ...  1975  663  2122   4  福州店
[3 rows x 11 columns]

4268


Index: 4269 entries, 0 to 4268
Data columns (total 11 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   日期      4269 non-null   object
 1   星期      4269 non-null   object
 2   门店号     4269 non-null   object
 3   码洋      4269 non-null   object
 4   天气      333 non-null    object
 5   实洋      4269 non-null   object
 6   客流量     4269 non-null   object
 7   客单数     4269 non-null   object
 8   交易数量    4269 non-null   object
 9   月份      4269 non-null   object
 10  门店      4268 non-null   object
dtypes: object(11)

        数据类型不同也可插入,但某列类型将变为object

        采用通过 loc[ ] 建索引赋值的方法多适用于对 dataframe 循环遍历添加行,可以避免索引冲突的问题。

2.df.append(dt2,ignore_index=False,verify_integrity=False)(在新一点的版本里为dt._append())

        ignore_index:默认False,这样行索引保持与原DataFrame中的行索引一致,即行索引重复不会受影响。若修改为True,结果的行索引会被重设为从0开始的整数索引。

        verify_integrity:默认False,添加的DataFrame中有相同的行索引时,可以保留原结果。该参数为True,添加的DataFrame中有相同的行索引就会抛出ValueError。设置为True可以避免结果中的行索引重复,但可能会导致添加失败,所以需要先观察原始数据。

        同时使用时,ignore_index优先生效,同时使用不会报错。

print(data2)
df2=data2.copy()
df2['new_col']=0    # 添加一列全为0的列
print(df2)
data=data2._append(df2,ignore_index=True)
print(data)
data2:
       日期 星期   门店号           码洋   天气  ...   客流量  客单数  交易数量  月份    门店
0    2023-01-31  二  1001  8105.611548  NaN  ...  1577  859  2004   1   龙华店
1    2023-01-31  二  1002  8117.412956  NaN  ...  1392  752  1462   1   石岩店
2    2023-01-31  二  1003  9369.565960  NaN  ...  1661  949  1258   1   观澜店
...         ... ..   ...          ...  ...  ...   ...  ...   ...  ..   ...
4265 2023-04-01  六  3008   383.240643  NaN  ...  1591  649  1363   4   惠州店
4266 2023-04-01  六  3009  5739.039035  NaN  ...  1443  901  2294   4   佛山店
4267 2023-04-01  六  3010  9178.243621  NaN  ...  1975  663  2122   4   福州店-
[4268 rows x 11 columns]

df2:
       日期 星期   门店号           码洋   天气  ...  客单数  交易数量  月份    门店  new_col
0    2023-01-31  二  1001  8105.611548  NaN  ...  859  2004   1   龙华店        0
1    2023-01-31  二  1002  8117.412956  NaN  ...  752  1462   1   石岩店        0
2    2023-01-31  二  1003  9369.565960  NaN  ...  949  1258   1   观澜店        0
...         ... ..   ...          ...  ...  ...  ...   ...  ..   ...      ...
4265 2023-04-01  六  3008   383.240643  NaN  ...  649  1363   4   惠州店        0
4266 2023-04-01  六  3009  5739.039035  NaN  ...  901  2294   4   佛山店        0
4267 2023-04-01  六  3010  9178.243621  NaN  ...  663  2122   4   福州店        0
[4268 rows x 12 columns]

data:
       日期 星期   门店号           码洋   天气  ...  客单数  交易数量  月份    门店  new_col
0    2023-01-31  二  1001  8105.611548  NaN  ...  859  2004   1   龙华店      NaN
1    2023-01-31  二  1002  8117.412956  NaN  ...  752  1462   1   石岩店      NaN
2    2023-01-31  二  1003  9369.565960  NaN  ...  949  1258   1   观澜店      NaN
...         ... ..   ...          ...  ...  ...  ...   ...  ..   ...      ...
8533 2023-04-01  六  3008   383.240643  NaN  ...  649  1363   4   惠州店      0.0
8534 2023-04-01  六  3009  5739.039035  NaN  ...  901  2294   4   佛山店      0.0
8535 2023-04-01  六  3010  9178.243621  NaN  ...  663  2122   4   福州店      0.0
[8536 rows x 12 columns]

        append方法可以添加多行,相当于添加一个dataframe,如果两个DataFrame的形状不一样,取并集,另一个df没有的列,其值为NaN

(二)删除行

1.df.drop[ ]:

        语法和上访的 drop 列相同,删除连续行或筛选后删除

print(data2.head(3))
df2=data2.drop(labels=range(2,4))
# 想删除某几行,只能用逗号隔开,或用range()函数,不能直接labels=[1:2]这样
print(df2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
4 2023-01-31  二  1006  9961.178449  NaN  9961.178449  1290  968  2537   1  公明店

(三)修改行

1.修改行名:

        rename,同修改列名一致,axis参数设为0

2.修改行值:

print(data2.head(3))
data2.iloc[0:2,2]=0000
# 如果写成了loc会新建一列,前两行为0其余是NaN
print(data2.head(3))

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二  1001  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二  1002  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

          日期 星期   门店号           码洋   天气           实洋   客流量  客单数  交易数量  月份   门店
0 2023-01-31  二     0  8105.611548  NaN  8105.611548  1577  859  2004   1  龙华店
1 2023-01-31  二     0  8117.412956  NaN  8117.412956  1392  752  1462   1  石岩店
2 2023-01-31  二  1003  9369.565960  NaN  9369.565960  1661  949  1258   1  观澜店

        修改单个值可以通过定位修改,或筛选满足条件的行进行修改,日常使用大批量的数据直接删除后拼接就好了

你可能感兴趣的:(pandas,数据分析,pandas,数据挖掘)