如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