![](/img/trans.png)
[英]How to create a new column with a conditional count in a groupby pandas dataFrame
[英]How to create a new column of dictionaries based on groupby, pandas DataFrame?
我在Python3.x中有以下pandas DataFrame,帶有兩列字符串。
import pandas as pd
dict1 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'WHLAOECVQR'],
'column2':['DPBVNJYANX', 'UWRAWDOB', 'CUTQVWHRIJ'], 'start':[79, 31, 52]}
df1 = pd.DataFrame(dict1)
print(df1)
# column1 column2 start
# 0 MXRBMVQDHF DPBVNJYANX 79
# 1 LJNVTJOY UWRAWDOB 31
# 2 WHLAOECVQR CUTQVWHRIJ 52
每行包含相同長度的字符串。 這些字符串以特定的方式索引,我正在編寫一個字典來在坐標之間進行翻譯。 列column1
的字符串從0開始(如預期)。 start
列中的整數用於表示column2
字符串的“起始索引”。 在第一行中,起始索引為79。
目標是根據索引創建字典。 因此,對於第一行, column1
的字符串從0
開始, column2
的字符串從79
開始。 字典“轉換”這些坐標如下:
{0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: 85, 7: 86, 8: 87, 9: 88}
我的目標是使用這些字典在pandas數據框中創建一個新列。 這很簡單(盡管我懷疑使用.apply()
有更快的方法):
for index, row in df1.iterrows():
df1.loc[index,'new'] = [{i: i + row['start'] for i, e in enumerate(row['column1'])}]
現在df1
有一列稱為new
:
df1.new
0 {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1 {0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: ...
2 {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object
我的問題是:假設column1
列中有多個相同字符串的條目。 這是一個例子:
import pandas as pd
dict2 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'LJNVTJOY', 'LJNVTJOY', 'WHLAOECVQR'], 'column2':['DPBVNJYANX', 'UWRAWDOB', 'PEKUYUQR', 'WPMLFVFZ', 'CUTQVWHRIJ'], 'start':[79, 31, 52, 84, 18]}
df2 = pd.DataFrame(dict2)
print(df2)
# column1 column2 start
# 0 MXRBMVQDHF DPBVNJYANX 79
# 1 LJNVTJOY UWRAWDOB 31
# 2 LJNVTJOY PEKUYUQR 52
# 3 LJNVTJOY WPMLFVFZ 84
# 4 WHLAOECVQR CUTQVWHRIJ 18
在這種情況下,具有LJNVTJOY
的坐標的字典應為:
{0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87],
4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
這是基於以下內容的列表字典
{0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: 37, 7: 38}
{0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: 58, 7: 59}
{0: 84, 1: 85, 2: 86, 3: 87, 4: 88, 5: 89, 6: 90, 7: 91}
編輯:這是正確的輸出。 有一個帶有'new'
列的DataFrame,它看起來如下所示:
df2.new
0 {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1 {0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
2 {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object
您可以使用cumcount
創建dict鍵
df2['dictkey']=df2.groupby('column1').cumcount()
df2.groupby('column1').apply(lambda x : dict(zip(x['dictkey'],x['start'])))
Out[94]:
column1
LJNVTJOY {0: 31, 1: 52, 2: 84}
MXRBMVQDHF {0: 79}
WHLAOECVQR {0: 18}
dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.