添加行列数据可以选择切片方式(iloc是不能添加数据的,loc才行)添加,也可以选择用pandas提供的相关api添加
还是以之前的dataframe为例:
1、添加行数据
例如添加悟空的成绩:
import pandas as pd
scores = [23, 88, 12], [99, 88, 100], [44, 77, 68]
df = pd.DataFrame(scores, index=['张三', '李四', '王二麻子'], columns=['语文', '数学', '英语'])
# 如果值为序列,并且序列长度不是1或3则会抛出异常,因为pandas不知道怎么赋值
1. df.loc["悟空"] = 100 / [100] / [100, 100, 100]
# append已经被删除了,改用concat代替
2.df = pd.concat([df, pd.DataFrame(([100, 100, 100], ), index=["悟空"], columns=['语文', '数学', '英语'])])
如果loc所用的key已存在,那就是修改数据。很明显切片赋值方式添加数据要简单的多,concat、join、merge等api虽然也能达到效果,但它们更多是用于合并两个dataframe。
2、添加列数据
① 所有人添加一门音乐课的成绩:
import pandas as pd
scores = [23, 88, 12], [99, 88, 100], [44, 77, 68]
df = pd.DataFrame(scores, index=['张三', '李四', '王二麻子'], columns=['语文', '数学', '英语'])
1. 切片赋值
df["音乐"] = 100
df["音乐"] = [100, 90, 80]
df.loc[:, "音乐"] = 100
df.loc[:, "音乐"] = [56, 67, 78]
2. assign
df = df.assign(音乐=[100, 90, 80])
df = df.assign(音乐=100)
3. eval
df.eval("音乐=100", inplace=True)
df.eval("音乐=[11, 22, 33]", inplace=True)
# inplace=True 表示就地修改df,而不是返回一个新的dataframe
4. insert
df.insert(3, "音乐", 90, allow_duplicates=True)
df.insert(3, "音乐", [78, 78, 78], allow_duplicates=True)
# allow_duplicates=True表示是否允许重复列名
② 所有人添加一门音乐课和一门历史课成绩:
import pandas as pd
scores = [23, 88, 12], [99, 88, 100], [44, 77, 68]
df = pd.DataFrame(scores, index=['张三', '李四', '王二麻子'], columns=['语文', '数学', '英语'])
1. 切片赋值
df[["音乐", "历史"]] = 100, 67
df.loc[:, ["音乐", "历史"]] = 100, 67
2. assign
d = {"音乐": [100, 90, 80], "历史": [110, 190, 80]}
df = df.assign(**d)
df = df.assign(音乐=100, 历史=90)
3. eval
df.eval("""
音乐=[11, 22, 33]
历史=[55, 55, 34]
""", inplace=True)
df.eval("""
音乐=10
历史=[55, 55, 34]
""", inplace=True)
对于eval,还有更多用法,比如现在需要加一个总成绩列,通过eval可以很容易实现:
import pandas as pd
scores = [23, 88, 12], [99, 88, 100], [44, 77, 68]
df = pd.DataFrame(scores, index=['张三', '李四', '王二麻子'], columns=['语文', '数学', '英语'])
df.eval("总分=语文+数学+英语", inplace=True)
print(df)
"""
语文 数学 英语 总分
张三 23 88 12 123
李四 99 88 100 287
王二麻子 44 77 68 189
"""