Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建新列并使用相同df中添加的字符串填充,以下划线作为分隔符_Python_Pandas_Dataframe - Fatal编程技术网

Python 创建新列并使用相同df中添加的字符串填充,以下划线作为分隔符

Python 创建新列并使用相同df中添加的字符串填充,以下划线作为分隔符,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: import pandas as pd ds = pd.DataFrame({'place': [1,2,3], 'date': ['6/7/2021','1/1/2031','1/4/2011'], 'city':['Moscow','New York','Sidney'], 'kids':[5,3,1]}) 看起来是这样的: city date kids place Moscow 6/7/2021 5 1 New Y

我有以下数据帧:

import pandas as pd
ds = pd.DataFrame({'place': [1,2,3], 'date': ['6/7/2021','1/1/2031','1/4/2011'], 
'city':['Moscow','New York','Sidney'], 'kids':[5,3,1]})
看起来是这样的:

city        date      kids   place
Moscow    6/7/2021     5       1
New York  1/1/2031     3       2
Sidney    1/4/2011     1       3
我需要在数据框中添加一个新的列“key”,其中的值将是一个字符串,该字符串将是特定列的每一行中的值的并集:“city”、“date”、“place”,并使用下划线(“u1”)作为分隔符

最终目标:

city        date      kids   place   key
Moscow    6/7/2021     5       1     Moscow_6/7/2021_1
New York  1/1/2031     3       2     New York_1/1/2031_2
Sidney    1/4/2011     1       3     Sidney_1/4/2011_3
首先,我将“place”列中的整数转换为字符串:

df['place'].apply(str)
其次,我删除了我不需要的列(但实际上该列应该在结果df中):

然后我尝试创建一个新列并用附加的字符串填充它:

df['key'] = df[col_list].apply(lambda x: x.sum())

但它在“key”列中返回我的NaN值,实际上这些值仍然没有附加undersoce作为分隔符

您只需添加类似于构建
str
的列,只需将最后一列强制转换为
str

In[87]:
df['key'] = df['city'] + '_' + df['date'] + '_' + df['place'].astype(str)
df

Out[87]: 
       city      date  kids  place                  key
0    Moscow  6/7/2021     5      1    Moscow_6/7/2021_1
1  New York  1/1/2031     3      2  New York_1/1/2031_2
2    Sidney  1/4/2011     1      3    Sidney_1/4/2011_3
计时 对于30k行df:

%timeit  df['city'] + '_' + df['date'] + '_' + df['place'].astype(str)
df
%timeit df[['city', 'date', 'place']].astype(str).apply('_'.join, 1)
%timeit df[['city', 'date', 'place']].astype(str).transform('_'.join, 1)

100 loops, best of 3: 9 ms per loop
10 loops, best of 3: 84 ms per loop
10 loops, best of 3: 83 ms per loop
这个方法似乎快了10倍,可能是因为它只是一个直接的矢量化加法,
apply
是一个循环的
for
循环,看起来
transform
需要进行某种形式的
分组
,排序,然后创建一个索引与原始df对齐的新对象,这就是我的猜测

其他@JohnGalt方法:

%timeit pd.Series(df[['city', 'date', 'place']].astype(str).values.tolist()).str.join('_')

100 loops, best of 3: 10.5 ms per loop

所以这比我的答案稍微慢一点。

你可以通过
应用
和加入使它更通用

In [485]: ds[['city', 'date', 'place']].astype(str).apply('_'.join, 1)
Out[485]:
0      Moscow_6/7/2021_1
1    New York_1/1/2031_2
2      Sidney_1/4/2011_3
dtype: object

In [486]: ds['key'] = ds[['city', 'date', 'place']].astype(str).apply('_'.join, 1)

In [487]: ds
Out[487]:
       city      date  kids  place                  key
0    Moscow  6/7/2021     5      1    Moscow_6/7/2021_1
1  New York  1/1/2031     3      2  New York_1/1/2031_2
2    Sidney  1/4/2011     1      3    Sidney_1/4/2011_3
或者,要使用
.str
方法,您可以

In [493]: pd.Series(ds[['city', 'date', 'place']].astype(str).values.tolist()).str.join('_')
Out[493]:
0      Moscow_6/7/2021_1
1    New York_1/1/2031_2
2      Sidney_1/4/2011_3
dtype: object

使用
df.transform
(v0.20+)尝试
df.assign


请注意,
df.assign
不在原位,要保持更改,您需要执行:
df=df.assign(…)

apply也可以完成这项工作:

df[key] = df[columns].apply(lambda x: '_'.join([str(y) for y in x]))

不知道将
transform
作为第一类方法添加到dfs中+1@EdChum对从0.20开始,我应该更多地关注“什么是新的”部分,了解“天才的定义是把复杂的事情简单化。”。谢谢
In [203]: df.assign(key=df[['city', 'date', 'place']].astype(str).transform('_'.join, 1))
Out[203]: 
       city      date  kids  place                  key
0    Moscow  6/7/2021     5      1    Moscow_6/7/2021_1
1  New York  1/1/2031     3      2  New York_1/1/2031_2
2    Sidney  1/4/2011     1      3    Sidney_1/4/2011_3
df[key] = df[columns].apply(lambda x: '_'.join([str(y) for y in x]))