如何遍历 Python 中的列表并从其他列表中添加值?

Posted

技术标签:

【中文标题】如何遍历 Python 中的列表并从其他列表中添加值?【英文标题】:How to iterate through a list of lists in Python and add values from other lists? 【发布时间】:2019-12-29 21:37:13 【问题描述】:

我有一个清单:

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

并尝试遍历它以获取值及其位置,如下所示:

date    1
country 1
date    2
country 1
date    2

并将其全部存储在 pandas DF 中。

正如建议的那样,我可以这样做,而且效果很好:

对元组列表使用列表推导式枚举和展平:

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

x = [(b, a) for i in my_list for (a, b) in enumerate(i, 1)]
print (x)
[('ga:date', 1), ('ga:country', 1), ('ga:date', 2), ('ga:country', 1), ('ga:date', 2)]

df = pd.DataFrame(x, columns = ['field','listIndex'])
print (df)
        field  listIndex
0     ga:date          1
1  ga:country          1
2     ga:date          2
3  ga:country          1
4     ga:date          2

或者如果可能的话改变列的位置:

x1 = [z for i in my_list for z in enumerate(i, 1)]
print (x1)
[(1, 'ga:date'), (1, 'ga:country'), (2, 'ga:date'), (1, 'ga:country'), (2, 'ga:date')]

df = pd.DataFrame(x1, columns = ['listIndex','field'])
print (df)
   listIndex       field
0          1     ga:date
1          1  ga:country
2          2     ga:date
3          1  ga:country
4          2     ga:date

但还有 3 个其他列表,我必须将它们添加到结果 df 中。

my_id_list = ['01', '02', '03']

start_dates = ['2019-01-01', '2019-01-03', '2019-01-10']

end_dates = ['2019-01-02', '2019-01-05', '2019-01-11']

所以它需要看起来像这样:

        field  listIndex   id start_date end_date
0     ga:date          1   01 2019-01-01 2019-01-02
1  ga:country          1   02 2019-01-03 2019-01-03
2     ga:date          2   02 2019-01-03 2019-01-03
3  ga:country          1   03 2019-01-10 2019-01-11
4     ga:date          2   03 2019-01-10 2019-01-11

值可以不同,没有解决办法。

感谢任何帮助,我只想结束工作中的一个项目并忘记它。

更新

我的 id 列表包含不同的 int 数字。它们可以不同,我的意思是,下面这 3 个并不是唯一的。

my_id_list = ['115126931', '199714437', '197531387']

所以它需要看起来像这样:

        field  listIndex   id        start_ date  end_date
0     ga:date          1   115126931 2019-01-01   2019-01-02
1  ga:country          1   199714437 2019-01-03   2019-01-03
2     ga:date          2   199714437 2019-01-03   2019-01-03
3  ga:country          1   197531387 2019-01-10   2019-01-11
4     ga:date          2   197531387 2019-01-10   2019-01-11

【问题讨论】:

到目前为止你尝试过什么? 考虑存储每个列表的索引,同时枚举为名为 id 的列。使用您拥有的 3 个列表创建另一个 df 并在 id 上合并,即 id_list 【参考方案1】:

你可以试试:

df=pd.DataFrame([(a,b,e) for e,i in enumerate(my_list) for (a, b) in enumerate(i, 1)],
                       columns=['list_index','feild','index_list_of_list'])
df1=pd.DataFrame(zip(map(int,my_id_list),start_dates,end_dates)
             ,columns=['id','startdate','enddate'])

df.merge(df1,left_on='index_list_of_list',right_index=True).drop('index_list_of_list',1)

   list_index       feild         id   startdate     enddate
0           1     ga:date  115126931  2019-01-01  2019-01-02
1           1  ga:country  199714437  2019-01-03  2019-01-05
2           2     ga:date  199714437  2019-01-03  2019-01-05
3           1  ga:country  197531387  2019-01-10  2019-01-11
4           2     ga:date  197531387  2019-01-10  2019-01-11

注意:还可以考虑通过pd.to_datetime()将日期更改为日期时间

【讨论】:

很酷,谢谢,但有一点时间。 ID 不仅仅是数字,它们已经预先定义。我不能将任何数字作为 id。 @AnnaDmitrieva 所以my_id_list 你的身份证对吗?并且看起来您正在查看列表列表下的列表索引以进行映射,您能否更新您的问题,提供有关如何进行连接的更多详细信息? 是的,没问题我会更新它。 my_id_list 是 id,但它们看起来像 '115126931' 这个。 @AnnaDmitrieva 我已经更新了我的答案,想法是一样的,只是合并方法改变了 @AnnaDmitrieva 没问题,mylist 的枚举数也发生了变化,它应该从 0 开始,因为分配给数据帧的默认索引是 0,所以在 right_index 上合并有效:)

以上是关于如何遍历 Python 中的列表并从其他列表中添加值?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:groupby A 列并从其他列创建元组列表?

如何比较日期并从选择列表中选择选项?

Python基础-列表(列表常用函数/列表遍历)

如何在python中反转字典并从重复的键值中创建一个列表

关于Python中的列表理解及用法

Python列表操作:遍历、range()、列表解析、列表切片、列表复制、元组