循环遍历python字典并操作每个值

循环遍历python字典并操作每个值,python,pandas,loops,dataframe,dictionary,Python,Pandas,Loops,Dataframe,Dictionary,我是一个相当新的python用户,我被一个问题困住了。任何指导都将不胜感激 我有一个熊猫数据框,有三列“ID”、“Intervention”和“GradeLevel”。见下面的代码: data = [[100,'Long', 0], [101,'Short', 1],[102,'Medium', 2],[103,'Long', 0],[104,'Short', 1],[105,'Medium', 2]] intervention_df = pd.DataFrame(data, columns

我是一个相当新的python用户,我被一个问题困住了。任何指导都将不胜感激

我有一个熊猫数据框,有三列“ID”、“Intervention”和“GradeLevel”。见下面的代码:

 data = [[100,'Long', 0], [101,'Short', 1],[102,'Medium', 2],[103,'Long', 0],[104,'Short', 1],[105,'Medium', 2]]

intervention_df = pd.DataFrame(data, columns = ['ID', 'Intervention', 'GradeLevel'])
然后,我创建了一个按“干预”分组的数据帧字典。见下面的代码:

intervention_dict = {Intervention: dfi for Intervention, dfi in df.groupby('Intervention')}
我的问题是你能循环字典的值并操作字典的每个值吗?具体来说,我试图引用一个查找表。查找表可以看作是一个花名册。我的目标是给名册上的任何人贴上“是-干预名称”或“不干预”的标签。这变得很棘手,因为比方说,长期干预只有0级。这意味着我想将等级为0的干预措施中的任何人标记为“Yes-Long”,而不在干预措施中的任何人标记为“No-Long”。这将成为一个名为“Value”的新列。我还需要创建另一个变量'Category',该变量将在本例中指定干预名称,它只是'Long'

lookup_data = [[100, 0], [101, 1],[102, 2],[103, 0],[104, 1],[105, 2], [106, 0], [107, 0],[108, 2],[109, 1]]
lookup_df = pd.DataFrame(lookup_data, columns = ['ID', 'GradeLevel'])
例如,“Long”字典在处理后的外观如下:

longint_data = [[100,'Long', 'Yes - Long'],[103,'Long', 'Yes - Long'], [106,'Long', 'No - Long'], [107,'Long', 'No - Long']]
longint_df = pd.DataFrame(longint_data, columns = ['ID','Category', 'Value'])
所有操作后所需的最终输出如下所示:

result_data = [[100,'Long', 'Yes - Long'] , [101,'Short','Yes - Short'], [102,'Medium','Yes - Medium'], [103,'Long', 'Yes - Long'], [104,'Short','Yes - Short'] , [105, 'Medium','Yes - Medium'], [106,'Long', 'No - Long'], [107,'Long', 'No - Long'], [108,'Medium','No - Medium'], [109,'Short','No - Short']]

result_df = pd.DataFrame(result_data, columns = ['ID','Category', 'Value'])

谢谢大家!

这就是我觉得你想要的。。但是没有更清楚的解释,我不确定

data = [[100,'Long', 0], [101,'Short', 1],[102,'Medium', 2],[103,'Long', 0],[104,'Short', 1],[105,'Medium', 2]]
intervention_df = pd.DataFrame(data, columns = ['ID', 'Intervention', 'GradeLevel'])

lookup_data = [[100, 0], [101, 1],[102, 2],[103, 0],[104, 1],[105, 2], [106, 0], [107, 0],[108, 2],[109, 1]]
lookup_df = pd.DataFrame(lookup_data, columns = ['ID', 'GradeLevel'])


df= pd.merge(intervention_df.assign(y='Yes'), lookup_df, on=['ID', 'GradeLevel'], how='outer')
df.loc[df.y.isnull(), 'y'] = 'No'


    ID Intervention  GradeLevel    y
0  100         Long           0  Yes
1  101        Short           1  Yes
2  102       Medium           2  Yes
3  103         Long           0  Yes
4  104        Short           1  Yes
5  105       Medium           2  Yes
6  106          NaN           0   No
7  107          NaN           0   No
8  108          NaN           2   No
9  109          NaN           1   No

这里是不使用字典干预的解决方案。下面是我从您的命令中获得的数据:

In [1048]: intervention_df
Out[1048]:
    ID Intervention  GradeLevel
0  100         Long           0
1  101        Short           1
2  102       Medium           2
3  103         Long           0
4  104        Short           1
5  105       Medium           2

In [1049]: lookup_df
Out[1049]:
    ID  GradeLevel
0  100           0
1  101           1
2  102           2
3  103           0
4  104           1
5  105           2
6  106           0
7  107           0
8  108           2
9  109           1
步骤1:在
lookup\u df
interference\u df
之间进行外部合并,创建列
将索引设置为
GradeLevel

In [1059]: df = lookup_df.merge(intervention_df, on=['ID', 'GradeLevel'], how='outer').assign(Value='Yes - '+intervention_df['Intervention']).set_index('GradeLevel')

In [1060]: df
Out[1060]:
             ID Intervention         Value
GradeLevel
0           100         Long    Yes - Long
1           101        Short   Yes - Short
2           102       Medium  Yes - Medium
0           103         Long    Yes - Long
1           104        Short   Yes - Short
2           105       Medium  Yes - Medium
0           106          NaN           NaN
0           107          NaN           NaN
2           108          NaN           NaN
1           109          NaN           NaN
步骤2:创建
df_fillna
以在
df

In [1063]: df_fillna = intervention_df.groupby('Intervention').head(1).assign(Value='No - '+intervention_df['Intervention']).set_index('GradeLevel')

In [1064]: df_fillna
Out[1064]:
             ID Intervention        Value
GradeLevel
0           100         Long    No - Long
1           101        Short   No - Short
2           102       Medium  No - Medium
步骤3(最终):使用
combined_first
df
中从
df_fillna
值中填充
NaN
,然后使用
reset_index
删除'GradeLevel
,并对
ID上的值进行排序`

In [1068]: df.combine_first(df_fillna).sort_values('ID').reset_index(drop=True)
Out[1068]:
    ID Intervention         Value
0  100         Long    Yes - Long
1  101        Short   Yes - Short
2  102       Medium  Yes - Medium
3  103         Long    Yes - Long
4  104        Short   Yes - Short
5  105       Medium  Yes - Medium
6  106         Long     No - Long
7  107         Long     No - Long
8  108       Medium   No - Medium
9  109        Short    No - Short

看起来你把事情弄得比实际需要的更复杂了,我对所有的循环和不同的数据帧都感到困惑。为什么不只是一个连接呢?啊,我忘了解释一个部分。对于每一次干预,我只想说“不”对于同一级别的人。例如,长期干预只有级别0,因此我只想与级别为0的人合并。我忘了在特定干预中添加过滤查找的步骤,只对唯一的级别进行过滤。仍然很混乱。你有类似
109,'Short',No-Short的事情“
在您的结果数据框中,但没有其他地方被引用,
109,
引用。
109
本身在查找df中被引用,但没有提到
Short
我编辑了我的初始问题,并对查找df进行了稍微详细的解释。这是一个花名册。因此,假设您在一次会议上只对幼儿园学生进行了干预学校。我想把参加干预的学生名单与全班名册进行比较。如果一名学生参加干预,他们将被标记为“是”,如果他们不参加干预,他们将被标记为“否”。