数据框操作

1. 创建dataframe

  • 法一
1
dat = pd.DataFrame({'id':[1,2,3], 'string': ['a', 'b','c']})
  • 法二(若已有现成的list)
1
2
3
dat = pd.DataFrame([n_clusters_start, score], columns = ["分类数", "得分"])
# 或
dat = pd.DataFrame({"分类数": n_clusters_start, "得分": score})

例:

1
2
3
4
5
6
7
exclamationCount = lambda text: sum([1 for x in text if x == '!'])
EC = tweet.apply(lambda x:exclamationCount(x))
EC = EC.tolist()
questionMarkCount = lambda text: sum([1 for x in text if x == '?'])
QC = tweet.apply(lambda x:questionMarkCount(x))
QC = QC.tolist()
dat = pd.DataFrame({'EC':EC,'QC':QC})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
eachLetterCount = lambda text,letter: sum([1 for x in text.lower() if x == letter])

FList = []
pattern = 'abcdefghijklmnopqrstuvwxyz'
j=0
for i in pattern:
F = tweet.apply(lambda x:eachLetterCount(x,i))
F = F.tolist()
FList.append(F)

res = pd.DataFrame(FList)
res = res.transpose()

pattern = 'abcdefghijklmnopqrstuvwxyz'
name = []
for i in pattern:
name.append("freqOf " + i)
res.columns = name
结果

2. 数据框拼接

ignore_index = True, 重新分配索引

2.1 append
1
result = result1.append(result2, ignore_index = True) # 粘贴行
2.2 concat

pandas.concat — pandas 1.3.0 documentation (pydata.org)

1
2
result = pd.concat([result1, result2], ignore_index = True) # 默认axis = 0, 粘贴行 
RF_eval = pd.concat([RF_eval, eval_raw], axis = 1) # 粘贴列
2.3 merge

pandas.merge — pandas 1.3.0 documentation (pydata.org)

image-20210717004007434
2.4 将数据框中的几列拼接为新的一列

例如有数据如下:

现想生成一列Combination,将Search Bar Shape, Search Button Design, Background Color三列的内容拼接起来:

1
2
3
# Creating a new variable represing the 8 combinations
df['Combination'] = df['Search Bar Shape'] + "_" + df['Search Button Design'] + "_" + df['Background Color']
df.head()
1721804733929

3. 删掉列

1
RF_eval.drop(['raw'], axis = 1, inplace = True)

4. 删掉行

1
dat = dat.drop(0) # 删掉第一行

5. 提取行索引

1
2
index0 = res.index[res['label'] == 0].tolist()
X0 = X[index0] # X为矩阵

6. 提取特定的行

1
2
3
df[df['id']==1] # 提取id为1的行
df[(df['id']>=1) & (df['id']<=5)] # 提取id在[1,5]之间的行(同理,'或'使用‘|’)
df.loc[df['id']==1, 'age'] #提取id为1的行的人的年龄

isin():

2.4中的数据为例,只取Combination为以下这些取值的行

1
2
3
4
5
6
7
selection = ['Original_Original_Original',
'Rectangle_Original_Light Pink',
'Rectangle_Star_Light Pink',
'Original_Star_Original']

df_partial = df[df['Combination'].isin(selection)]
df_partial
1721806042111

↑注意:此时index还和原来的一样,如果想重新设置索引,使用 rest_index=True

1
2
3
4
5
df_partial.reset_index(drop=True, inplace=True)
df_partital

# drop: 重新设置索引后,是否将原索引作为新的一列并入dataframe,默认为False
# inplace: 是否在原dataframe上改动,默认为False
1721806817599

7. DataFrame 中 axis 的概念

Pandas教程 | 数据处理三板斧——map、apply、applymap详解 - 知乎 (zhihu.com)

在 DataFrame 对象的大多数方法中,都会有 axis 这个参数,它控制了你指定的操作是沿着0轴还是1轴进行。axis=0代表操作对列columns进行,axis=1代表操作对行row进行,如下图所示。

image-20210717170137958

换言之,如果想增加一列(如把两个数据框横向拼接在一起(沿着axis=1的方向)),则选择axis=1,如果想增加一行(如对以上数据,对height求和(结果将显示在最下方,即"增加了一行"(沿着axis=0的方向))),则选择axis=0

假设现在需要对上述数据框中的数值列分别进行取对数求和的操作,这时可以用apply进行相应的操作,因为是对列进行操作,所以需要指定axis=0

1
2
3
4
5
# 沿着0轴求和
data[["height","weight","age"]].apply(np.sum, axis=0)

# 沿着0轴取对数
data[["height","weight","age"]].apply(np.log, axis=0)
image-20210717171536577

8. 重命名列

1
2
3
4
5
6
7
# Change variable: Date -> ds, time-series (Udemy) -> y
df = df.rename(columns = {'Date': 'ds',
'Udemy': 'y'})

# 或使用inplace=True
df.rename(columns = {'InvoiceDate': 'Recency',
'InvoiceNo': 'Frequency'}, inplace = True)