这几天遇到了一个关于表格合并的问题,其实问题很简单。对于两个表格df1和df2,取出df1的每一行特征和df2的每一行的特征合并,再将label合并。但是看了很多pandas关于表的合并,其并不适用到我这个问题,所以在此我想简单的总结一下关于pandas的表格合并方法和解决我自身问题的解决方法(主要)。
问题描述
df1:
f_1 | f_2 | label_1 |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
df2:
f_3 | label_2 |
---|---|
3 | 0 |
4 | 0 |
目标
df3:
f_1 | f_2 | f_3 | label_3 |
---|---|---|---|
1 | 1 | 3 | 1 |
1 | 1 | 4 | 1 |
2 | 2 | 3 | 1 |
2 | 2 | 4 | 1 |
其实这就是一个很简单的两个for循环叠加在一起的问题,但是其本身的格式问题,合并起来较为麻烦
解决方法一:
使用concat函数来拼接两个表格
concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False)
axis参数可以确定是行拼接(取0),还是列拼接(取1),但是列的拼接存在一个问题就是,他拼接的过程是按照行号合并的,换句话说就是相同的一行拼接成一个,反之拼接成两行
代码:
data1 = pd.read_csv('data/data_date.csv',header=None)
data2 = pd.read_csv('data/data_id.csv',header=None)
for i in range(len(data1)):
for j in range(len(data2)):
data3 = pd.concat([data1.iloc[[i],0:-1],data2.iloc[[j],0:-1]],axis=1)
当i=j时,合并成一行,不同时合并成两行
例如
data3 = pd.concat([data1.iloc[[1],0:-1],data2.iloc[[2],0:-1]],axis=1,join='outer')
print(data3)
data4 = pd.concat([data1.iloc[[1],0:-1],data2.iloc[[1],0:-1]],axis=1,join='outer')
print(data4)
#输出结果
0 0 1
1 3 NaN NaN
2 NaN 2 2
0 0 1
1 3 1 1
所以就存在很大的局限,不同的行号就不能合成一行。
除此之外,join可以选择的是取交集还是并集,但是这个并集的前提是合并的两个表格存在相同的列,从而进行合并。
解决方法二:
使用append()函数来解决,即
data3 =data1.iloc[[0],0:-1]
data4 = data2.iloc[[1],0:-1]
data3.append(data4,ignore_index=True)
print(data3)
#输出结果
0 1
0 3 NaN
1 2 2
这种方法其实append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐),所以并不能达到我们的要求。merge的合并方法得到与append函数得到的结果一样,再次不赘述。
解决方法三:
将表格转化成list,进行list操作
首先将dataframe转化成list
data3 = data1.values
data3 = np.array(data3).tolist() #从标签开始记数
data4 = data2.values
data4 = np.array(data4).tolist()
注意这里的list第一行是包含原先的dataframe的index的,所以从第二行开始才是数据。
data = []#存储新生成的list
for i in range(1,len(data3)):
for j in range(1,len(data4)):
data5 = data3[i][1:-1] +data4[j][1:-1] #合并所有的特征数据
data5.append(data3[i][-1]+data4[j][-1])#对两个表格的label进行合并
data.append(data5)
对两个list进行合并,label合并,使用append()函数添加到data5中完成一行,最后保存到data这个list中去成为一行数据。
test=pd.DataFrame(data=data)
test.to_csv("ConData/data.csv", encoding="utf-8")
print(data)
因为list格式的数据不能转化为csv格式数据,所以我们将list转化为dataframe格式数据,再存储起来。
完整代码:
data1 = pd.read_csv('data/data_date.csv',header=None)
data2 = pd.read_csv('data/data_id.csv',header=None)
data3 = data1.values
data3 = np.array(data3).tolist() #从标签开始记数
data4 = data2.values
data4 = np.array(data4).tolist()
data = []
for i in range(1,len(data3)):
for j in range(1,len(data4)):
data5 = data3[i][1:10] +data4[j][1:10]
data5.append(data3[i][-1]+data4[j][-1])
data.append(data5)
# print(data)
test=pd.DataFrame(data=data)
test.to_csv("ConData/data.csv", encoding="utf-8")
print(data)
这篇博客没有详细讲解merge,concat的用法,主要说的是自己遇到的实际问题的解决方法。因为concat使用这些都能在网上找到,如以下这些:
https://blog.youkuaiyun.com/zutsoft/article/details/51498026
https://blog.youkuaiyun.com/milton2017/article/details/54406482/