pandas数据框常用操作

阅读量: searchstar 2021-08-21 00:36:44
Categories: Tags:

pandas官方文档:https://pandas.pydata.org/docs/reference/

DataFrame官方文档:https://pandas.pydata.org/docs/reference/frame.html

添加新列:https://www.geeksforgeeks.org/adding-new-column-to-existing-dataframe-in-pandas/

创建

构造函数:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html

从已有列创建

a = [1, 2, 3]
b = ['x', 'y', 'z']
pd.DataFrame({'a': a, 'b': b})
   a  b
0  1  x
1  2  y
2  3  z

从Series list创建

li = []
li.append(pd.Series([1, 2, 3]))
li.append(pd.Series([4, 5, 6]))
# https://stackoverflow.com/a/57034111/13688160
# Series相当于列向量,所以concat的方向为column
# 然后.T转置一下
df = pd.concat(li, axis=1).T
# https://www.kdnuggets.com/2022/11/4-ways-rename-pandas-columns.html
df.columns = ['a', 'b', 'c']
df
   a  b  c
0  1  2  3
1  4  5  6

从stdin读取

直接把sys.stdin当file输入进去即可:

latencies = pd.read_table(sys.stdin, names=['operation', 'latency(ns)'], delim_whitespace=True)

来源:https://stackoverflow.com/questions/18495846/pandas-data-from-stdin

添加新行

https://pandas.pydata.org/docs/reference/api/pandas.concat.html#pandas.concat

注意,append已经被deprecated了:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html

如果需要把Series作为行添加到DataFrame里,需要先将其转换成DataFrame,再转置:

r = pd.Series([1, 2, 3], index = ['col1', 'col2', 'col3'])
d = pd.DataFrame({'col1': [0, 1], 'col2': [2, 3], 'col3': [4, 5]})
pd.concat([d, pd.DataFrame(r).T])

注意,pd.concat会返回一个新的DataFrame,所以复杂度是O(n)的:https://stackoverflow.com/a/36489724/13688160

根据index取出行

.iloc,与python自带的list的语法类似:

test = pd.DataFrame({'col1': range(0, 10), 'col2': range(10, 20)})
# 取出第2行到第4行:
test.iloc[1:4]
# 取出最后一行
test.iloc[-1]

取出满足条件的行

# 选择年龄大于25岁且性别为男性的数据行
print(df[(df['age'] > 25) & (df['gender'] == 'male')])

来源:https://www.ycpai.cn/python/UcXZsYr8.html

取出多列

test = pd.DataFrame({'col1': [0, 1], 'col2': [2, 3], 'col3': [4, 5]})
# 取出col2和col1列
test[['col2', 'col1']]

输出:

   col2  col1
0     2     0
1     3     1

求均值

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mean.html

test = pd.DataFrame({'col1': [0, 1, 2, 3], 'col2': [4, 5, 6, 7]})
# 求每列的平均数
test.mean()
test.mean(axis=0)
# 求每行的平均数
test.mean(axis=1)

groupby

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html

每3行分组并求均值

test = pd.DataFrame({'col1': range(0, 10), 'col2': range(10, 20)})
test.groupby(test.index // 3).mean()

输出:

   col1  col2
0   1.0  11.0
1   4.0  14.0
2   7.0  17.0
3   9.0  19.0

将某列的值相同的合并成一个list

https://stackoverflow.com/questions/22219004/how-to-group-dataframe-rows-into-list-in-pandas-groupby

遍历

https://stackoverflow.com/questions/16476924/how-to-iterate-over-rows-in-a-dataframe-in-pandas

前缀和

test = pd.DataFrame({'col1': [0, 1, 2, 3], 'col2': [4, 5, 6, 7]})
test['col1'].cumsum()

转dict

https://stackoverflow.com/questions/18695605/how-to-convert-a-dataframe-to-a-dictionary

df.set_index('id')

然后就变成了一个dict-like了,value是其他所有列。

如果要得到映射到另一列的dict:

df.set_index('id')['column']

转成真正的dict:

df.set_index('id')['column'].to_dict()