首页 > 解决方案 > 遍历两个 pandas 列表

问题描述

我正在清理我的一些代码以使其更具pythonic,但我想知道是否可以使用诸如 itertools 或 pandas 方法之类的更好的方式编写以下代码。下面的代码有效,但是出于性能原因,我希望删除双 for 循环并合并一些代码。

最终,我正在处理一个调用 Pandas 列的索引列表。

def foo(dataset):
  api_reshaped = pd.DataFrame(columns=['foo', 'bar'])
  k = 0

  for index, _ in dataset.iterrows():
    for key in dataset.iloc[index][0][0]:
      api_reshaped.loc[k, 'foo'] = key
      api_reshaped.loc[k, 'bar'] = dataset.iloc[index][0][0][key]
      k += 1
  return api_reshaped

以下是此函数的预期输入/输出:

 foo_input = pd.dataframe({
      'batch_data': [{'foo_query': [{'bar_query': 'data'}]}],
      'query_spell': ['foo']
    })

print foo_input(foo_input)
# expected_output = pd.dataframe({
#  'foo': 'foo_query',
#  'bar': [{'bar_query': 'data'}]
# })

非常感谢!

标签: pythonpandas

解决方案


您可以将列表推导与转置一起使用:

# your input data
foo_input = pd.DataFrame({
  'batch_data': [{'foo_query': [{'bar_query': 'data'}]}],
  'query_spell': ['foo']
})

# use list comprehension with transpose
df = pd.DataFrame([item for item in foo_input['batch_data']]).T.reset_index()

# rename your columns
df.columns = ['Foo', 'Bar']

      Foo              Bar
0   foo_query   [{'bar_query': 'data'}]

applymap如果你想删除列表并且只有一个字典,你可以使用lambda 函数


推荐阅读