目录
一、列
(一)增加列:
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.修改行值:
比如在数据最后后面多加一列成交率:
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
比如,我想在根据日期在第二列加一列 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)df.column=['column1','column2',...]
这种方法可以对所有列名进行修改,要求列表内的长度与旧列名的长度一致
(2)df.rename(columns={'oldname1':'newname1','oldname2':'newname2'},inplace=FALSE/TURE})
这种方法可以只对某些列名修改,inplace=True时会在原Datafram上进行更改,rename 也可以修改 axis 参数用于修改行索引
(3)也可以在导数据的时候直接采用新的列名,避免混乱目前只需要知道这几种就好
(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)筛选满足条件的值修改,数据的筛选查找日后专门出一篇文章总结一下
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 观澜店
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
语法和上访的 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 公明店
rename,同修改列名一致,axis参数设为0
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 观澜店
修改单个值可以通过定位修改,或筛选满足条件的行进行修改,日常使用大批量的数据直接删除后拼接就好了