Python 将数据帧值合并到新数据帧
我正在将Excel文件中的两个数据框值合并到一个新的数据框中,但合并后的值更改为十进制数。这是我的密码: 我希望合并的数据帧: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
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