如何在python中从数据帧设置dict中的值

2024-09-28 18:48:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来像这样:

enter image description here

创建df的代码:

dd = {'name': ["HARDIE'S MOBILE HOME PARK", 'CRESTVIEW RV PARK',
       'HOMESTEAD TRAILER PARK', 'HOUSTON PARK MOBILE HOME PARK',
       'HUDSON MOBILE HOME PARK', 'BEACH DRIVE MOBILE HOME PARK',
       'EVANS TRAILER PARK'],
       'country': ['USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA'],
      'coordinates': ['30.44126118, -86.6240656099999',
       '30.7190163500001, -86.5716222299999',
       '30.5115772500001, -86.4628417499999',
       '30.4424195300001, -86.64733076',
       '30.7629176200001, -86.5928893399999', '30.44417349, -86.59951996',
       '30.4427800300001, -86.62941091'],
      'status':['OPEN', 'CLOSED', 'OPEN', 'OPEN', 'OPEN', 'OPEN', 'OPEN']}

df2 = pd.DataFrame(data=dd)

我想做的是创建一个具有以下结构的词典:

{'destination1': 'CRESTVIEW RV PARK; 30.7190163500001, -86.5716222299999',
 'destination2': 'HOMESTEAD TRAILER PARK; 30.5115772500001, -86.4628417499999',
 'destination3': 'HOUSTON PARK MOBILE HOME PARK; 30.4424195300001, -86.64733076',
 'destination4': 'HUDSON MOBILE HOME PARK; 30.7629176200001, -86.5928893399999',
 'destination5': 'BEACH DRIVE MOBILE HOME PARK  ; 30.44417349, -86.59951996'}

如您所见,每个值必须包含名称;从第二行到最后一行的坐标。我正在使用以下代码来执行此操作:

d1 = {f"destination{k}":v + "; " + i for k in range(1, len(df1)-1) for v,i in zip(df1.name, df1.coordinates)}

然而,这是我得到的输出:

{'destination1': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091',
 'destination2': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091',
 'destination3': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091',
 'destination4': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091',
 'destination5': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091'}

它只读取数据帧的最后一行,每个键都有相同的值,但我想要的是,对于每个键,它的值必须来自数据帧中从第二行到最后一行的每一行

如果有人知道怎么做,我会非常感谢你的帮助


Tags: 数据代码nameparkhomeopenmobiledd
2条回答

示例中的dict理解有两个for循环:

d1 = {
    f"destination{k}":v + "; " + i
    for k in range(1, len(df1)-1)
    for v,i in zip(df1.name, df1.coordinates)
}

在这些循环中,k独立于v和i进行迭代。第二个循环有很多问题(要理解它们,只需通过操作df1.namedf1.coordinateszip(df1.name, df1.coordinates)来了解这是如何工作的-注意df1.name是一个保留属性,它引用数据帧的名称,而不是列“name”)

您真正想要的是在df1中为每一行循环多个元素。为此,只需使用第一个循环,但在构建值时从df访问所需的元素:

d1 = {
    f"destination{k}": (df1.loc[k, 'name'] + "; " + df1.loc[k, 'coordinates'])
    for k in range(1, len(df1)-1)
}

有关更多信息,请查看this FullStack Python guide's理解部分

或者,(最好)使用熊猫

d1 = pd.Series(
    df1['name'] + '; ' + df['coordinates'],
    index=('destination' + df.index.astype(str)),
)

如果此时您真的需要一个字典,您可以使用d1 = d1.to_dict()将该系列转换为字典

你可以像这样列举拉链

dd = {'name': ["HARDIE'S MOBILE HOME PARK", 'CRESTVIEW RV PARK',
       'HOMESTEAD TRAILER PARK', 'HOUSTON PARK MOBILE HOME PARK',
       'HUDSON MOBILE HOME PARK', 'BEACH DRIVE MOBILE HOME PARK',
       'EVANS TRAILER PARK'],
       'country': ['USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA'],
      'coordinates': ['30.44126118, -86.6240656099999',
       '30.7190163500001, -86.5716222299999',
       '30.5115772500001, -86.4628417499999',
       '30.4424195300001, -86.64733076',
       '30.7629176200001, -86.5928893399999', '30.44417349, -86.59951996',
       '30.4427800300001, -86.62941091'],
      'status':['OPEN', 'CLOSED', 'OPEN', 'OPEN', 'OPEN', 'OPEN', 'OPEN']}

df1 = pd.DataFrame(data=dd)

d_out = {
    f"destination{idx+1}":'; '.join(v) for idx, v in enumerate(zip(df1.name[1:], df1.coordinates[1:]))
}

d_out

{'destination1': 'CRESTVIEW RV PARK; 30.7190163500001, -86.5716222299999',
 'destination2': 'HOMESTEAD TRAILER PARK; 30.5115772500001, -86.4628417499999',
 'destination3': 'HOUSTON PARK MOBILE HOME PARK; 30.4424195300001, -86.64733076',
 'destination4': 'HUDSON MOBILE HOME PARK; 30.7629176200001, -86.5928893399999',
 'destination5': 'BEACH DRIVE MOBILE HOME PARK; 30.44417349, -86.59951996',
 'destination6': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091'}

你不必做dict理解就能得到这个结果,如果你能像这样在pandas数据框中做几列,你就能得到这个结果

df1['destination'] = [f"destination{k}" for k in range(len(df1))]
df1['value'] = df1['name'] + "; " + df1['coordinates'] 

df1[['destination', 'value']][1:].set_index("destination").to_dict()['value']

{'destination1': 'CRESTVIEW RV PARK; 30.7190163500001, -86.5716222299999',
 'destination2': 'HOMESTEAD TRAILER PARK; 30.5115772500001, -86.4628417499999',
 'destination3': 'HOUSTON PARK MOBILE HOME PARK; 30.4424195300001, -86.64733076',
 'destination4': 'HUDSON MOBILE HOME PARK; 30.7629176200001, -86.5928893399999',
 'destination5': 'BEACH DRIVE MOBILE HOME PARK; 30.44417349, -86.59951996',
 'destination6': 'EVANS TRAILER PARK; 30.4427800300001, -86.62941091'}

相关问题 更多 >