当前位置:   article > 正文

DataFrame对于行列的增加、修改和删除_怎样修改dataframe中某一列的内容

怎样修改dataframe中某一列的内容

目录

一、列

(一)增加列:

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

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

(二)修改列

1.更改列名

2.更改列的值

(三)删除列

1.del:

3.df.drop/df.pop()::

二、行

(一)增加行

1.df.loc[index]=[ ]

2.df.append(obj,ignore_index=False,verify_integrity=False,sort=False)

(二)删除行

1.df.drop():

(三)修改行

1.修改行名:

2.修改行值:


        增删改可能需要筛选数据,关于数据的条件筛选可见文章:

DataFrame数据的筛选和排序_dataframe筛选_带带琪宝的博客-CSDN博客

一、列

(一)增加列:

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

        相当于新增一不存在的列,可以使用已存在的数据列进行运算得到新列,比如在数据最后后面多加一列成交率:

  1. print(data2.head(3))
  2. data2['成交率']=data2['客单数']/data2['客流量']
  3. print(data2.head(3))
  4. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  5. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  6. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  7. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  8. 日期 星期 门店号 码洋 天气 ... 客单数 交易数量 月份 门店 成交率
  9. 0 2023-01-311001 8105.611548 NaN ... 859 2004 1 龙华店 0.544705
  10. 1 2023-01-311002 8117.412956 NaN ... 752 1462 1 石岩店 0.540230
  11. 2 2023-01-311003 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:

  1. print(data2.head(3))
  2. season_col=[]
  3. for i in range(len(data2)):
  4. if data2['日期'].dt.month[i]>=1 and data2['日期'].dt.month[i]<=3:
  5. season_col.append(1)
  6. elif data2['日期'].dt.month[i]>3 and data2['日期'].dt.month[i]<=6:
  7. season_col.append(2)
  8. elif data2['日期'].dt.month[i] > 6 and data2['日期'].dt.month[i] <= 9:
  9. season_col.append(3)
  10. elif data2['日期'].dt.month [i]> 9 and data2['日期'].dt.month[i] <= 12:
  11. season_col.append(4)
  12. data2.insert(1,'season',season_col)
  13. print(data2.head(3))
  14. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  15. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  16. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  17. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  18. 日期 season 星期 门店号 码洋 ... 客流量 客单数 交易数量 月份 门店
  19. 0 2023-01-31 11001 8105.611548 ... 1577 859 2004 1 龙华店
  20. 1 2023-01-31 11002 8117.412956 ... 1392 752 1462 1 石岩店
  21. 2 2023-01-31 11003 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可以修改,但需要索引对齐,否则会出错(不报错,全为空)

  1. print(data2.head(3))
  2. data2['天气']='晴'
  3. print(data2.head(3))
  4. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  5. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  6. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  7. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  8. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  9. 0 2023-01-311001 8105.6115488105.611548 1577 859 2004 1 龙华店
  10. 1 2023-01-311002 8117.4129568117.412956 1392 752 1462 1 石岩店
  11. 2 2023-01-311003 9369.5659609369.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

  1. print(data2.head(3))
  2. data2['月份'].replace(1,'01',inplace=True)
  3. print(data2.head(3))
  4. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  5. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  6. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  7. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  8. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  9. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 01 龙华店
  10. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 01 石岩店
  11. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 01 观澜店

(3)筛选满足条件的值修改

(三)删除列

1.del:

        del 删除列会直接改变原 DataFrame

  1. print(data2.head(3))
  2. del data2['天气']
  3. print(data2.head(3))
  4. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  5. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  6. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  7. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  8. 日期 星期 门店号 码洋 实洋 客流量 客单数 交易数量 月份 门店
  9. 0 2023-01-311001 8105.611548 8105.611548 1577 859 2004 1 龙华店
  10. 1 2023-01-311002 8117.412956 8117.412956 1392 752 1462 1 石岩店
  11. 2 2023-01-311003 9369.565960 9369.565960 1661 949 1258 1 观澜店

3.df.drop/df.pop()::

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

  1. print(data2.head(3))
  2. df=data2.drop(labels = ['天气','码洋'], axis = 1) # 将删除列后的数据赋给df
  3. print(data2.head(3)) # 未改变
  4. print(df.head(3))
  5. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  6. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  7. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  8. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  9. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  10. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  11. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  12. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  13. 日期 星期 门店号 实洋 客流量 客单数 交易数量 月份 门店
  14. 0 2023-01-311001 8105.611548 1577 859 2004 1 龙华店
  15. 1 2023-01-311002 8117.412956 1392 752 1462 1 石岩店
  16. 2 2023-01-311003 9369.565960 1661 949 1258 1 观澜店

        区别见:DataFrame中删除操作pop和drop的区别_dataframe pop-CSDN博客

        建议用 pop(),代码简洁且有返回值,数据还可以继续使用

二、行

(一)增加行

1.df.loc[index]=[ ]

  1. print(data2.tail(3))
  2. print(len(data2))
  3. data2.loc[len(data2)]=['2023-04-02','日','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN']
  4. data2.info()
  5. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  6. 4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
  7. 4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
  8. 4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店
  9. [3 rows x 11 columns]
  10. 4268
  11. <class 'pandas.core.frame.DataFrame'>
  12. Index: 4269 entries, 0 to 4268
  13. Data columns (total 11 columns):
  14. # Column Non-Null Count Dtype
  15. --- ------ -------------- -----
  16. 0 日期 4269 non-null object
  17. 1 星期 4269 non-null object
  18. 2 门店号 4269 non-null object
  19. 3 码洋 4269 non-null object
  20. 4 天气 333 non-null object
  21. 5 实洋 4269 non-null object
  22. 6 客流量 4269 non-null object
  23. 7 客单数 4269 non-null object
  24. 8 交易数量 4269 non-null object
  25. 9 月份 4269 non-null object
  26. 10 门店 4268 non-null object
  27. dtypes: object(11)

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

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

2.df.append(obj,ignore_index=False,verify_integrity=False,sort=False)

        在新一点的版本里为dt._append(),该方法会在 DataFrame 末尾行追加数据(原数据不发生改变),可以添加多行,相当于添加一个dataframe,另一个 df 没有的列,其值为NaN,形状取并集

        参数:

  • obj:追加对象,可以为字典、Series、列表(不同维度的列表追加方式不同,一维:按一列添加、二维:每个列表按行添加、三维会将一个列表作为一个值添加,了解即可)
  • ignore_index:默认False,这样行索引保持与原DataFrame中的行索引一致,即行索引重复不会受影响。若修改为True,结果的行索引会被重设为从0开始的整数索引。
  • verify_integrity:默认False,添加的DataFrame中有相同的行索引时,可以保留原结果。该参数为True,添加的DataFrame中有相同的行索引就会抛出ValueError。设置为True可以避免结果中的行索引重复,但可能会导致添加失败,所以需要先观察原始数据。

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

  1. print(data2)
  2. df2=data2.copy()
  3. df2['new_col']=0 # 添加一列全为0的列
  4. print(df2)
  5. data=data2._append(df2,ignore_index=True)
  6. print(data)
  7. data2:
  8. 日期 星期 门店号 码洋 天气 ... 客流量 客单数 交易数量 月份 门店
  9. 0 2023-01-311001 8105.611548 NaN ... 1577 859 2004 1 龙华店
  10. 1 2023-01-311002 8117.412956 NaN ... 1392 752 1462 1 石岩店
  11. 2 2023-01-311003 9369.565960 NaN ... 1661 949 1258 1 观澜店
  12. ... ... .. ... ... ... ... ... ... ... .. ...
  13. 4265 2023-04-01 六 3008 383.240643 NaN ... 1591 649 1363 4 惠州店
  14. 4266 2023-04-01 六 3009 5739.039035 NaN ... 1443 901 2294 4 佛山店
  15. 4267 2023-04-01 六 3010 9178.243621 NaN ... 1975 663 2122 4 福州店-
  16. [4268 rows x 11 columns]
  17. df2:
  18. 日期 星期 门店号 码洋 天气 ... 客单数 交易数量 月份 门店 new_col
  19. 0 2023-01-311001 8105.611548 NaN ... 859 2004 1 龙华店 0
  20. 1 2023-01-311002 8117.412956 NaN ... 752 1462 1 石岩店 0
  21. 2 2023-01-311003 9369.565960 NaN ... 949 1258 1 观澜店 0
  22. ... ... .. ... ... ... ... ... ... .. ... ...
  23. 4265 2023-04-01 六 3008 383.240643 NaN ... 649 1363 4 惠州店 0
  24. 4266 2023-04-01 六 3009 5739.039035 NaN ... 901 2294 4 佛山店 0
  25. 4267 2023-04-01 六 3010 9178.243621 NaN ... 663 2122 4 福州店 0
  26. [4268 rows x 12 columns]
  27. data:
  28. 日期 星期 门店号 码洋 天气 ... 客单数 交易数量 月份 门店 new_col
  29. 0 2023-01-311001 8105.611548 NaN ... 859 2004 1 龙华店 NaN
  30. 1 2023-01-311002 8117.412956 NaN ... 752 1462 1 石岩店 NaN
  31. 2 2023-01-311003 9369.565960 NaN ... 949 1258 1 观澜店 NaN
  32. ... ... .. ... ... ... ... ... ... .. ... ...
  33. 8533 2023-04-01 六 3008 383.240643 NaN ... 649 1363 4 惠州店 0.0
  34. 8534 2023-04-01 六 3009 5739.039035 NaN ... 901 2294 4 佛山店 0.0
  35. 8535 2023-04-01 六 3010 9178.243621 NaN ... 663 2122 4 福州店 0.0
  36. [8536 rows x 12 columns]

(二)删除行

1.df.drop():

        使用位置索引删除数据,不修改原数据,标签找不到会报错

        语法和上面的 drop 列相同,删除连续行或筛选后删除,也可使用 index 进行删除

  1. print(data2.head(3))
  2. # 删一行
  3. df1=drop(0)
  4. df2=data2.drop(labels=range(2,4))
  5. # 想删除某几行,只能用逗号隔开,或用range()函数,不能直接labels=[1:2]这样
  6. print(df2.head(3))
  7. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  8. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  9. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  10. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  11. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  12. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  13. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  14. 4 2023-01-311006 9961.178449 NaN 9961.178449 1290 968 2537 1 公明店

(三)修改行

1.修改行名:

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

2.修改行值:

  1. print(data2.head(3))
  2. data2.iloc[0:2,2]=0000
  3. # 如果写成了loc会新建一列名为“2”的列,前两行为0其余是NaN
  4. print(data2.head(3))
  5. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  6. 0 2023-01-311001 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  7. 1 2023-01-311002 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  8. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店
  9. 日期 星期 门店号 码洋 天气 实洋 客流量 客单数 交易数量 月份 门店
  10. 0 2023-01-310 8105.611548 NaN 8105.611548 1577 859 2004 1 龙华店
  11. 1 2023-01-310 8117.412956 NaN 8117.412956 1392 752 1462 1 石岩店
  12. 2 2023-01-311003 9369.565960 NaN 9369.565960 1661 949 1258 1 观澜店

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/635068
推荐阅读
相关标签
  

闽ICP备14008679号