Python 将数据帧值合并到新数据帧

Python 将数据帧值合并到新数据帧,python,string,pandas,series,Python,String,Pandas,Series,我正在将Excel文件中的两个数据框值合并到一个新的数据框中,但合并后的值更改为十进制数。这是我的密码: 我希望合并的数据帧: cable_block pair 1 10 1 11 3 123 3 222 我插入了一个数据框,将这两个数据框与分隔符/组合在一起,下面是我的代码: df['new_col'] = df[['cable_block', 'pair']].apply(lamb

我正在将Excel文件中的两个数据框值合并到一个新的数据框中,但合并后的值更改为十进制数。这是我的密码:

我希望合并的数据帧:

cable_block    pair
1              10
1              11
3              123
3              222
我插入了一个数据框,将这两个数据框与分隔符
/
组合在一起,下面是我的代码:

df['new_col'] = df[['cable_block', 'pair']].apply(lambda x: '/'.join(x.astype(str), axis=1))
我得到的结果是:

cable_block    pair   new_col
1              10     1.0/10.0
1              11     1.0/11.0
3              123    3.0/123.0
3              222    3.0/222.0
经过搜索,我找到了一个很好的答案 Psidom和SKIREBATTIE。所以我试着:

df['new_col'] = df['new_col'].applymap(str)

但它没有按它应该的方式工作。从代码上看,它应该是有效的,但我觉得奇怪的是它没有


还有其他解决方法吗?

为什么不使用
aType

df.astype(str).apply('/'.join,1)
Out[604]: 
0     1/10
1     1/11
2    3/123
3    3/222
dtype: object

首先,要删除尾随的
.0
,请确保数据为
int

 df = df.astype(int)
然后你可以做:

df['cable_block'].astype(str) + '/' + df['pair'].astype(str)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object
另一个确保格式正确的选项可以是:

 df.apply(lambda x: "%d/%d" %(x['cable_block'], x['pair']), axis=1)

0     1/10
1     1/11
2    3/123
3    3/222
dtype: object

数据框中的数据可能是浮点数,而不是整数。

您可以使用列表和f字符串:

df['new_col'] = [f'{cable_block}/{pair}' for cable_block, pair in df.values]

print(df)

   cable_block  pair new_col
0            1    10    1/10
1            1    11    1/11
2            3   123   3/123
3            3   222   3/222
该方法与备选方案比较合理:

df = pd.concat([df]*10000, ignore_index=True)

%timeit df['cable_block'].astype(str) + '/' + df['pair'].astype(str)  # 62.8 ms
%timeit [f'{cable_block}/{pair}' for cable_block, pair in df.values]  # 85.1 ms
%timeit list(map('/'.join, map(list, df.values.astype(str))))         # 157 ms
%timeit df.astype(str).apply('/'.join,1)                              # 1.11 s

您需要字符串有什么特别的原因吗?即使是
元组
也可能更有用/更有效地进行后续操作,但字符串的创建成本很高,操作起来也很困难。@jpp我试图使用字符串,因为我想要的输出看起来像是在分割两个数据帧。我认为使用字符串可能会保留数据的完整性。术语说明,您是串联字符串,而不是“两个数据帧”。数据帧是整个表,序列是列。@jpp注意到了这一点,谢谢你的注意。我仍然得到了与
.0
相同的输出。代码是正确的,但我没有得到正确的输出。是相同的数据帧吗?在你分享的那一个里面没有NaN。如果有,您可以先删除它们:
df=df.dropna(how='any',axis=1)
!因此,应该首先删除NaN。谢谢你的帮助。很高兴它起了作用。您应该给出可复制的示例,这就是问题所在,dataframe没有您的NAN。我看到了在数据帧转换为stiring之后,NaN也会连接起来的一面,我可以一路使用.drop.contains()。我将注意到这一点。谢谢。我的Excel文件中有两个以上的列,所以我想我需要指定要组合的数据帧。@RickyGuilar然后df[['cable_block','pair']].astype(str).apply('/'.join,1)谢谢,但我仍然得到了相同的输出。我认为'pair'数据帧是一个浮点,但当我尝试将其转换为int时,我得到了ValueError。尝试了,但得到了
ValueError:如果你愿意过危险的生活,就不能将float NaN转换为整数:
df['cable_block'].astype(int,errors='ignore').astype(str,errors='ignore')+'/'+df['pair']).astype(int,errors='ignore').astype(str,errors='ignore')
df['new_col'] = [f'{cable_block}/{pair}' for cable_block, pair in df.values]

print(df)

   cable_block  pair new_col
0            1    10    1/10
1            1    11    1/11
2            3   123   3/123
3            3   222   3/222
df = pd.concat([df]*10000, ignore_index=True)

%timeit df['cable_block'].astype(str) + '/' + df['pair'].astype(str)  # 62.8 ms
%timeit [f'{cable_block}/{pair}' for cable_block, pair in df.values]  # 85.1 ms
%timeit list(map('/'.join, map(list, df.values.astype(str))))         # 157 ms
%timeit df.astype(str).apply('/'.join,1)                              # 1.11 s