我想在 for 循环中调用结构相同的子问题列表(例如 E1_1、E1_2、E1_3 等(。我的目标是根据受访者是否表示他们应该回答主要问题(例如,如果 df['EOPS'] 等于 1,这意味着受访者表示他们正在回答"E"问题(以及如果他们没有回答主要问题(例如,如果"E1"没有被回答,"E1_1"、"E1_2"、"E1_3"等应重新编码为 NaN(
法典:
df = pd.DataFrame([[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], columns=['EOPS', 'E1', 'E1_1', 'E1_2', 'E1_3', 'E2', 'E2_1', 'E2_2', 'E2_3', 'E3', 'E3_1', 'E3_2', 'E3_3'])
list_of_questions = ['E1', 'E2', 'E3'] # each question in list has associated questions 'E1_1', 'E1_2', 'E1_3', 'E2_1', 'E2_2', 'E2_3', etc.
for question in list_of_questions:
for i in range(1,3):
if df['E1'] == 0 & df['EOPS'] == 1:
df['E1_`i''] = np.where(data_final['E1_`i''] == 0, None, data_final['E1_`i''])
如何调用此循环中的子问题?对于那些熟悉 Stata 的人来说,这将使用`'
引号来完成,就像我上面在i
所做的那样,但我想知道是否可以在 Python 中完成同样的事情。
我希望实现的是:
df = pd.DataFrame([[1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, None, None, None, None, None, None, None, None, None, None, None, None]], columns=['EOPS', 'E1', 'E1_1', 'E1_2', 'E1_3', 'E2', 'E2_1', 'E2_2', 'E2_3', 'E3', 'E3_1', 'E3_2', 'E3_3'])
谢谢!
无需循环,我们可以利用.any
和.loc
就地分配给您的列
例如
import numpy as np
cols = df.iloc[:,1:].columns.tolist()
df.loc[((df[cols] == 0).all(axis=1)) & (df['EOPS'] == 1), cols] = np.nan
选择列的另一种方法:
cols = df.filter(regex='Ed+').columns
结果:
EOPS E1 E1_1 E1_2 E1_3 E2 E2_1 E2_2 E2_3 E3 E3_1 E3_2 E3_3
0 1 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0
1 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
根据您的问题不完全确定,但我怀疑您正在寻找zip
:
a = [1,2,3]
b = ["a", "b", "c"]
for x, y in zip(a, b):
print(x, y)
将给予:
1 a
2 b
3 c
另一种在没有zip
的情况下给出相同结果的方法(您应该使用zip
,但迭代器通常更好(:
a = [1,2,3]
b = ["a", "b", "c"]
for i, x in enumerate(a):
print(x, b[i])