问题描述
我正在尝试将以下数据框转换为字典。 我想通过A列进行分组,并列出常见序列。例如
示例1:
Maven 3.x
预期输出:
-Dsonar.host.url=${bamboo.sonar_url} -Dsonar.login=${bamboo.sonar_token_password} org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar -Dsonar.pitest.mode=reuseReport
示例2:
n1 v1 v2
2 A C 3
3 A D 4
4 A C 5
5 A D 6
预期输出:
{'A': [{'C':'3','D':'4'},{'C':'5','D':'6'}]}
所以基本上n1 n2 v1 v2
s1 A C 3
s1 A D 4
s1 A C 5
s1 A D 6
s1 B P 6
s1 B Q 3
和{'s1': {'A': [{'C': 3,'D': 4},{'C': 5,'D': 6}],'B': {'P': 6,'Q': 3}}}
重复一个序列,我想将C
和D
合并到一个字典中,并列出是否多次出现
请注意(当前我正在使用以下代码):
C
这将返回:
D
此外,可能还会有def recur_dictify(frame):
if len(frame.columns) == 1:
if frame.values.size == 1: return frame.values[0][0]
return frame.values.squeeze()
grouped = frame.groupby(frame.columns[0])
d = {k: recur_dictify(g.iloc[:,1:]) for k,g in grouped}
return d
重复的另外一系列{s1 : {'A': {'C': array(['3','5'],dtype=object),'D': array(['4','6'],'B':{'E':'5','F':'6'}}
和具有单个值的s2
和E,F,G,E,G
解决方法
让我们创建一个函数 Picasso.with(MainActivity::this)
.load(imageUrl)
.into(imageView,object: com.squareup.picasso.Callback {
override fun onSuccess() {
//set animations here
}
override fun onError(e: java.lang.Exception?) {
//do smth when there is picture loading error
}
})
,该函数使用dictify
列中的顶级键创建一个字典,并将name
列中的值重复出现到不同的子字典中:
v1
from collections import defaultdict
def dictify(df):
dct = defaultdict(list)
for k,g in df.groupby(['n1',df.groupby(['n1','v1']).cumcount()]):
dct[k[0]].append(dict([*g[['v1','v2']].values]))
return dict(dct)
更新:
如果可以有主要变量的数量,即dictify(df)
{'A': [{'C': 3,'D': 4},{'C': 5,'D': 6}]}
,我们可以使用更通用的方法:
[n1,n2,...]
def update(dct,keys,val):
k,*_ = keys
dct[k] = update(dct.get(k,{}),_,val) if _ \
else [*np.hstack([dct[k],[val]])] if k in dct else val
return dct
def dictify(df,keys):
dct = dict()
for k,g1 in df.groupby(keys):
for _,g2 in g1.groupby(g1.groupby('v1').cumcount()):
update(dct,k,dict([*g2[['v1','v2']].values]))
return dict(dct)
,
这是一个简单的单行语句,可以解决您的问题:
def df_to_dict(df):
return {name: [dict(x.to_dict('split')['data'])
for _,x in d.drop('name',1).groupby(d.index // 2)]
for name,d in df.groupby('name')}
这里是一个例子:
df = pd.DataFrame({'name': ['A'] * 4,'v1': ['C','D'] * 2,'v2': [3,4,5,6]})
print(df_to_dict(df))
输出:
{'A': [{'C': 3,'D': 6}]}