我有七个数据帧tbl1851,tbl1861,tbl1871,tbl1881,tbl1891,tbl1901,tbl1911。
每个数据框具有相同的字段“性别”,“年龄”,“数字”。
我想通过首先创建一系列布尔值来从每个数据框中选择一个子集。
我的代码看起来像
AM1851 = ((tbl1851.Sex=="M") & (tbl1851.Age>=15) & (tbl1851.Age<999))
AM1861 = ((tbl1861.Sex=="M") & (tbl1861.Age>=15) & (tbl1861.Age<999))
AM1871 = ((tbl1871.Sex=="M") & (tbl1871.Age>=15) & (tbl1871.Age<999))
AM1881 = ((tbl1881.Sex=="M") & (tbl1881.Age>=15) & (tbl1881.Age<999))
AM1891 = ((tbl1891.Sex=="M") & (tbl1891.Age>=15) & (tbl1891.Age<999))
AM1901 = ((tbl1901.Sex=="M") & (tbl1901.Age>=15) & (tbl1901.Age<999))
AM1911 = ((tbl1911.Sex=="M") & (tbl1911.Age>=15) & (tbl1911.Age<999))
我想知道是否有一个循环脚本可以达到与上面列出的代码相同的结果?
有很多不同的选择组合,所以我真的不想复制和粘贴以及研究和替换很多次。
答案 0 :(得分:1)
不要将每个数据框都作为单独的变量,而是将它们放在列表中:
frames = [
# dataframe 1,
# dataframe 2,
# etc.
]
然后,您可以轻松地循环浏览它们以创建另一个列表:
AMs = []
for frame in frames:
AMs.append((frame.Sex=="M") & (frame.Age>=15) & (frame.Age<999))
答案 1 :(得分:0)
我认为一个函数可以做到这一点,因为每一行使用相同的tblxxxx
对象3次。我会尝试类似的东西:
def build_my_data_set(input_data_frame):
return ((input_data_frame.Sex=="M") & (input_data_frame.Age>=15) & (input_data_frame.Age<999))
my_data_frames = [build_my_data_set(data_item) for data_item in [tbl1851, tbl1861, tbl1871]] # but you would fill the list with every item you want to include
结果my_data_frames
将代表您定义的所有AMxxxx
对象的列表。从而将它们全部压缩为一个变量,您可以将其编入索引以找到适当的项目。如果您需要关联xxxx
位,则应该改为实现一个字典,并将其用作键!
答案 2 :(得分:0)
您可以将它们分组为一个数组并遍历它们:
tbls = [tbl1851, tbl1861, tbl1871, tbl1881, tbl1891, tbl1901, tbl1911]
my_func = lambda x : ((x.Sex=="M") & (x.Age>=15) & (x.Age<999))
AMs=[]
for df in k:
AMs.append(df.apply(my_func))
如果您想通过元素的名称访问元素,而不是创建列表,则可以创建一个字典,以变量的名称作为它们的键:
AM_names=["AM1851","AM1861","AM1871","AM1871","AM1881","AM1891","AM1901","AM1911"]
tbls = [tbl1851, tbl1861, tbl1871, tbl1881, tbl1891, tbl1901, tbl1911]
my_func = lambda x : ((x.Sex=="M") & (x.Age>=15) & (x.Age<999))
AMs={}
for idx, df in enumerate(tbls):
AMs[df[AM_names[idx]]]=df.apply(my_func)