Eka*_*ina 2 python dataframe 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]})
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
city date kids place
Moscow 6/7/2021 5 1
New York 1/1/2031 3 2
Sidney 1/4/2011 1 3
Run Code Online (Sandbox Code Playgroud)
我需要向DataFrame添加一个新列'key',其中的值将是一个字符串,它将是某些列的每一行中的值的并集:'city','date','place'和下划线( '_')作为分隔符.
最终目标:
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
Run Code Online (Sandbox Code Playgroud)
首先,我将'place'列中的整数转换为字符串:
df['place'].apply(str)
Run Code Online (Sandbox Code Playgroud)
其次,我删除了我不需要的列(但实际上这个列应该在生成的df中):
col_list= list(df)
col_list.remove('kids')
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建一个新列并用附加的字符串填充它:
df['key'] = df[col_list].apply(lambda x: x.sum())
Run Code Online (Sandbox Code Playgroud)
但是它在"键"列中返回NaN值,实际上值仍然不附加作为分隔符的下划线.
您只需添加类似于构建a的列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
Run Code Online (Sandbox Code Playgroud)
时间 为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
Run Code Online (Sandbox Code Playgroud)
这个方法似乎快10倍,可能因为它只是一个直接的矢量化添加,apply是一个cythonised for循环,它看起来像transform需要做某种形式的grouping排序,然后创建一个索引与原始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
Run Code Online (Sandbox Code Playgroud)
所以这比我的回答慢一点.
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |