如dataframe
1
2
|
data1[ '月份' ] = int (month) #加入月份和企业名称 data1[ '企业' ] = parmentname |
可以增加单列,并赋值,如果想同时对多列进行赋值
1
|
data1[ '月份' , '企业' ] = int (month) , parmentname #加入月份和企业名称 |
会出错
ValueError: Length of values does not match length of index
1
|
data[[ '合计' , '平均' ]] = '数据' , '月份' |
类似这样的,也无效
KeyError: “None of [Index([‘合计', ‘平均'], dtype=‘object')] are in the [columns]”
只有下例中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import pandas as pd chengji = [[ 100 , 95 , 100 , 99 ],[ 90 , 98 , 99 , 100 ],[ 88 , 95 , 98 , 88 ],[ 99 , 98 , 97 , 87 ],[ 96.5 , 90 , 96 , 85 ],[ 94 , 94 , 93 , 91 ],[ 91 , 99 , 92 , 87 ], [ 85 , 88 , 85 , 90 ], [ 90 , 92 , 99 , 88 ], [ 90 , 88 , 89 , 81 ], [ 85 , 89 , 89 , 82 ], [ 95 , 87 , 86 , 88 ], [ 90 , 97 , 97 , 98 ], [ 80 , 92 , 89 , 98 ], [ 80 , 98 , 85 , 81 ], [ 98 , 88 , 95 , 92 ]] data = pd.DataFrame(chengji,columns = [ '语文' , '英语' , '数学' , '政治' ]) print (data) # data1=data[['数学','语文','英语','政治']] #排序 # data1=data1.reset_index(drop=True) #序列重建 # data1.index.names=['序号'] #序列重命名 # data1.index=data1.index+1 #序列从1开始 # print (data1) data = pd.DataFrame(chengji,columns = [ '语文' , '英语' , '数学' , '政治' ],index = [i for i in range ( 1 , len (chengji) + 1 )]) print (data) data[[ '合计' , '平均' ]] = data. apply ( lambda x: (x. sum (), x. sum () / 4 ),axis = 1 ,result_type = 'expand' ) print (data[:]) data = pd.DataFrame(chengji,columns = [ '语文' , '英语' , '数学' , '政治' ],index = [i for i in range ( 1 , len (chengji) + 1 )]) print (data) data[[ '合计' , '平均' ]] = data. apply ( lambda x:( '数据' , '月份' ),axis = 1 ,result_type = 'expand' ) print (data[:]) |
应用apply 并设置result_type=‘expand' 参数才可以。
先前的例子,用如下的方法就行了
1
2
3
4
|
data1[[ '月份' , '企业' ]] = data1. apply ( lambda x:( int (month),parmentname),axis = 1 ,result_type = 'expand' ) # data1['月份']=int(month) #加入月份和企业名称 # data1['企业']=parmentname #print (data1) |
后记:
如果'月份','企业'列存在,用如下也可,上例中,直接可以创建不存在的列。
1
|
data1.lco[:,[ '月份' , '企业' ]] = int (month),parmentname |
或
1
|
data1[[ '月份' , '企业' ]] = int (month),parmentname |
今天又遇到一个从某列截取字符串长度写到另一列的,也一并写到这里:
货品列在原表中无,取货品代码的前12位。
1
2
|
totaldata = totaldata.reset_index(drop = False ) totaldata[ '货品' ] = totaldata[ '货品代码' ]. apply ( lambda x:x[: 12 ]) |
后记:2020.5.17又遇到想新增两列并赋值的问题
1
2
3
4
5
6
7
8
|
import numpy as np import pandas as pd from pandas import Series chengji = [[ 'N' , 95 , 0 ], [ 'N' , 100 , 88 ], [ 'N' , 88 , 100 ], [ 'N' , 66 , 0 ]] data = pd.DataFrame(chengji, columns = [ 'p' , 'x' , 'g' ]) data[[ '序号' , '列名' ]] = data[[ 'p' , 'x' ]] #pd.DataFrame(data[['p','x']])# .apply(lambda x : x ) print (data) |
补充:pandas 的apply返回多列,并赋值
代码如下:
1
2
3
4
5
6
7
8
|
import pandas as pd df_tmp = pd.DataFrame([ { "a" : "data1" , "cnt" : 100 },{ "a" : "data2" , "cnt" : 200 }, ]) df_tmp a cnt data1 100 data2 200 |
方法一:使用apply 的参数result_type 来处理
1
2
3
4
5
6
7
8
9
10
|
def formatrow(row): a = row[ "a" ] + str (row[ "cnt" ]) b = str (row[ "cnt" ]) + row[ "a" ] return a, b df_tmp[[ "fomat1" , "format2" ]] = df_tmp. apply (formatrow, axis = 1 , result_type = "expand" ) df_tmp a cnt fomat1 format2 data1 100 data1100 100data1 data2 200 data2200 200data2 |
方法二:使用zip打包返回结果来处理
1
2
3
4
5
|
df_tmp[ "fomat1-1" ], df_tmp[ "format2-2" ] = zip ( * df_tmp. apply (formatrow, axis = 1 )) df_tmp a cnt fomat1 format2 fomat1 - 1 format2 - 2 data1 100 data1100 100data1 data1100 100data1 data2 200 data2200 200data2 data2200 200data2 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/weixin_45903952/article/details/105320158