解决dataframe格式表格的合并

这几天遇到了一个关于表格合并的问题,其实问题很简单。对于两个表格df1和df2,取出df1的每一行特征和df2的每一行的特征合并,再将label合并。但是看了很多pandas关于表的合并,其并不适用到我这个问题,所以在此我想简单的总结一下关于pandas的表格合并方法和解决我自身问题的解决方法(主要)。

问题描述

df1:

f_1f_2label_1
111
221

df2:

f_3label_2
30
40

目标

df3:

f_1f_2f_3label_3
1131
1141
2231
2241

其实这就是一个很简单的两个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.csdn.net/zutsoft/article/details/51498026
https://blog.csdn.net/milton2017/article/details/54406482/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值