【跟着stackoverflow学Pandas】 - Adding new column to existing DataFrame in Python pandas - Pandas 添加列
最近做一个系列博客,跟着stackoverflow学Pandas。
以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序:
https://stackoverflow.com/questions/tagged/pandas?sort=votes&pageSize=15
Adding new column to existing DataFrame in Python pandas - Pandas 添加列
pandas官方给出了对列的操作, 可以参考:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
- 数据准备
随机生成8*3的DataFrame df1,筛选 a 列大于0.5的行组成df2,作为我们的初始数据。
import numpy as np
import pandas as pd
print pd.__version__
#0.19.2
np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(8, 3), columns=['a', 'b', 'c'])
print df1
a b c
# 0 1.764052 0.400157 0.978738
# 1 2.240893 1.867558 -0.977278
# 2 0.950088 -0.151357 -0.103219
# 3 0.410599 0.144044 1.454274
# 4 0.761038 0.121675 0.443863
# 5 0.333674 1.494079 -0.205158
# 6 0.313068 -0.854096 -2.552990
# 7 0.653619 0.864436 -0.742165
df2 = df1[df1['a']> 0.5]
df3 = df2
sLength = len(df2['a'])
d = pd.Series(np.random.randn(sLength))
直接赋值
采用 df2['d'] = d 或者 df2.loc[:, 'd'] = d 直接进行赋值。
print df2
# a b c
# 0 1.764052 0.400157 0.978738
# 1 2.240893 1.867558 -0.977278
# 2 0.950088 -0.151357 -0.103219
# 4 0.761038 0.121675 0.443863
# 7 0.653619 0.864436 -0.742165
print d
# 0 2.269755
# 1 -1.454366
# 2 0.045759
# 3 -0.187184
# 4 1.532779
print type(d)
#<class 'pandas.core.series.Series'>
# 下面的方法可以,但是会有SettingWithCopyWarning警告
df2['d'] = d
# /Library/Python/2.7/site-packages/ipykernel/__main__.py:1: SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead
# See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
# if __name__ == '__main__':
# 为了避免警告我们可以采用这种方式来进行直接赋值
df2.loc[:, 'd'] = d
print df2
a b c d
# 0 1.764052 0.400157 0.978738 2.269755
# 1 2.240893 1.867558 -0.977278 -1.454366
# 2 0.950088 -0.151357 -0.103219 0.045759
# 4 0.761038 0.121675 0.443863 1.532779
# 7 0.653619 0.864436 -0.742165 NaN
df2.loc[:, 'd1'] = d.tolist() # 或者 d.values()
# d.tolist() 返回list
# d.values 返回 numpy.ndarray
print df2
# a b c d d1
# 0 1.764052 0.400157 0.978738 2.269755 2.269755
# 1 2.240893 1.867558 -0.977278 -1.454366 -1.454366
# 2 0.950088 -0.151357 -0.103219 0.045759 0.045759
# 4 0.761038 0.121675 0.443863 1.532779 -0.187184
# 7 0.653619 0.864436 -0.742165 NaN 1.532779
我们可以发现,df2是5行数据, d 也是5个数据,但是赋值之后d列仅有4个值,深究发现,d是Series类型,df2['d'] = d 是根据index对其进行赋值,只有 0 1 2 4 等4个index在d中有对应, 7 没有对应所以为NaN.
如果忽略index影响,我们可以采用d.tolist() 或者 d.values()
同时,在 pandas 0.19.2 中,采用 df2['d'] = d, 提示SettingWithCopyWarning,尽量避免这种方式,采用df2.loc[:, 'd'] = d的方式进行列的增加。
assign 赋值
官方推荐,assign 为DataFrame增加新列。
pandas官方参考:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html
print df3
# a b c
# 0 1.764052 0.400157 0.978738
# 1 2.240893 1.867558 -0.977278
# 2 0.950088 -0.151357 -0.103219
# 4 0.761038 0.121675 0.443863
# 7 0.653619 0.864436 -0.742165
print d
# 0 2.269755
# 1 -1.454366
# 2 0.045759
# 3 -0.187184
# 4 1.532779
# 对 d.values (numpy.ndarray)进行赋值
df3 = df3.assign(d = d.values)
print df3
# a b c d
# 0 1.764052 0.400157 0.978738 2.269755
# 1 2.240893 1.867558 -0.977278 -1.454366
# 2 0.950088 -0.151357 -0.103219 0.045759
# 4 0.761038 0.121675 0.443863 -0.187184
# 7 0.653619 0.864436 -0.742165 1.532779
# 对 d(Series) 进行赋值
df4 = df3.assign(d = d)
print df4
a b c d
# 0 1.764052 0.400157 0.978738 2.269755
# 1 2.240893 1.867558 -0.977278 -1.454366
# 2 0.950088 -0.151357 -0.103219 0.045759
# 4 0.761038 0.121675 0.443863 1.532779
# 7 0.653619 0.864436 -0.742165 NaN
可以发现 df3 采用 assign 进行赋值,可以得到跟loc直接赋值相同的结果, 区别在于赋值的类型是 Series还是 numpy.ndarray 或者是list。
同时,assign还可以进行多种操作,比如:
df4 = df3.assign(ln_A = lambda x: np.log(x['a']))
print df4
# a b c d ln_A
# 0 1.764052 0.400157 0.978738 2.269755 0.567614
# 1 2.240893 1.867558 -0.977278 -1.454366 0.806875
# 2 0.950088 -0.151357 -0.103219 0.045759 -0.051200
# 4 0.761038 0.121675 0.443863 -0.187184 -0.273072
# 7 0.653619 0.864436 -0.742165 1.532779 -0.425231
【跟着stackoverflow学Pandas】 - Adding new column to existing DataFrame in Python pandas - Pandas 添加列的更多相关文章
- 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】Select rows from a DataFrame based on values in a column -pandas 筛选
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】Delete column from pandas DataFrame-删除列
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】How to iterate over rows in a DataFrame in Pandas-DataFrame按行迭代
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】“Large data” work flows using pandas-pandas大数据处理流程
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 【跟着stackoverflow学Pandas】Renaming columns in pandas-列的重命名
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- 学机器学习,不会数据处理怎么行?—— 二、Pandas详解
在上篇文章学机器学习,不会数据处理怎么行?—— 一.NumPy详解中,介绍了NumPy的一些基本内容,以及使用方法,在这篇文章中,将接着介绍另一模块——Pandas.(本文所用代码在这里) Panda ...
- 跟着百度学PHP[14]-PDO之Mysql的事务处理2
前面所将仅仅是在纯mysql下的讲解,这节就是要将其搬到PDO台面上来了. 将自动提交关闭. SetAttribute下有一个PDO::ATTR_AUTOCOMMIT 将其设置为0即可关闭,如:$pd ...
随机推荐
- UVa 11572 唯一的雪花(滑动窗口)
https://vjudge.net/problem/UVA-11572 题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列,使得该序列中没有相同的元素. 思路:很简单的题,也没啥好解释的了. ...
- 【Mac常用shell】
1. 杀掉占用某端口的进程: lsof -i:9000 -> 确认PID kill PID 2. 环境变量: 直接用{PATH}:路径 的办法,经常不好用,我的解决办法: vi ~/.bas ...
- bootstrap在ie8下,兼容媒体查询
最近使用bootstrap做网站的时候发现,在ie8下的媒体查询一直失效: 后来解决了,做如下记录: 1.必须运行在服务器下 2.hack 条件语法,如下: <!--[if lte ie 9]& ...
- 对Tomcat启动或运行时,项目对jar包依赖路径的一些粗浅认知
Tomcat在运行webapp项目的时候,需要各种依赖jar包.它会从2个地方去找这些包 1.Tomcat自己的lib目录中 2.webapp目录下,webapps\{项目}\WEB-INF\lib ...
- python 时间元组转时间戳
#!/usr/bin/python # -*- coding: UTF- -*- import time print(time.mktime((, , , , , , , , ))) 输出 15382 ...
- MVC 子对象数据传递
1.接受参数 public ActionResult Address(User user) { return View(); } 2. User对象类型 public class User { pub ...
- 《剑指offer》第十八题(删除链表中重复的结点)
// 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...
- Codeforces 545D - Queue
545D - Queue 思路:忍耐时间短的排在前面,从小到大排序,贪心模拟,记录当前等待时间,如过等待时间大于当前的这个人得忍耐时间,那么就把这个人扔到最后面,不要管他了(哼╭(╯^╰)╮,谁叫你那 ...
- js实现软件版本号的比较
//js实现软件版本号的比较 //随机举两个例子 pc2.4.3 或者pc3.5.6 /** * 输入 v1,v2 * 返回true代表v1比v2的版本新,false则代表v1与v2相等或者v1< ...
- 转:Too many systemd: Created slice !
OS: centos-release-7-4.1708 /va/log/message 大量这种提示信息: resolvent: Here is how I got rid of these: vi ...