我使用pyodbc将一些数据加载到熊猫数据框。该数据库包含单个浮点数的列表。给定的数据帧名称为df
,type(df.iloc[0][0]
,type(df.iloc[0][0][0]
给list
作为输出,当type(df.iloc[0][0][0][0]
给float
时。
我需要将这些列表放平,以便仅获取数字,最后只包含一个数字列表,而不是一个列表列表。
为了可视化,这里是保存在df.iloc[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.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], [32.09984], [0.0], [0.0], [0.0], [0.0], [0.0], [0.40704], [0.40704], [32.09984], [32.061440000000005], [32.048640000000006], [32.01024], [0.49152000000000007], [0.0], [0.00256], [0.00512], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]
有什么想法吗?谢谢
答案 0 :(得分:0)
如果您不介意使用numpy数组,则可以执行以下操作:
df.iloc[0][0] = numpy.array(df.iloc[0][0]).flatten()
或此处的代码用于整列
df["Column"] = df["Column"].apply(lambda x : np.array(x).flatten())
,如果以后需要将您的数据作为列表:
df["Column"] = df["Column"].apply(lambda x : list(np.array(x).flatten()))
对于所有列:
for col in df.columns:
if col not in ["ColumnThatShouldNotBeTransformed1", "ColumnThatShouldNotBeTransformed2"]:
df[col] = df[col].apply(lambda x : np.array(x).flatten())
答案 1 :(得分:0)
如果所有子列表都包含单个元素:
>>> x = [[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.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [32.09984], [0.0], [0.0], [0.0], [0.0], [0.0], [0.40704], [0.40704], [32.09984], [32.061440000000005], [32.048640000000006], [32.01024], [0.49152000000000007], [0.0], [0.00256], [0.00512], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]
>>> list(map(lambda a:a[0],x))
否则:
>>> from itertools import chain
>>> list(chain(*x))
将x
替换为df.iloc[0][0]
答案 2 :(得分:0)
从熊猫0.25开始,您可以尝试df.explode()
mcve:
# ltest = [[0], [314], [42]]
# df = pd.DataFrame([[ltest, ltest, ltest], [ltest, ltest, ltest]], columns=['A', 'B', 'C'])
# A B C
# 0 [[0], [314], [42]] [[0], [314], [42]] [[0], [314], [42]]
# 1 [[0], [314], [42]] [[0], [314], [42]] [[0], [314], [42]]
方法:
创建新的数据框:
df_new = pd.DataFrame()
for c in df.columns:
df_new[c] = df[c].explode().str.get(0)
# A B C
# 0 0 0 0
# 0 314 314 314
# 0 42 42 42
# 1 0 0 0
# 1 314 314 314
# 1 42 42 42
索引不再唯一->创建多重索引:
ct = df_new.groupby(df_new.index).cumcount()
# 0 0
# 0 1
# 0 2
# 1 0
# 1 1
# 1 2
# dtype: int64
df_new.index = pd.MultiIndex.from_arrays([df_new.index, ct])
结果:
# A B C
# 0 0 0 0 0
# 1 314 314 314
# 2 42 42 42
# 1 0 0 0 0
# 1 314 314 314
# 2 42 42 42
或根据喜好将以前的子列表元素作为行:
df_new.unstack()
# A B C
# 0 1 2 0 1 2 0 1 2
# 0 0 314 42 0 314 42 0 314 42
# 1 0 314 42 0 314 42 0 314 42
现在您可以像往常一样使用Pandas索引这些数据,只需注意multiindex需要一个元组:
df_new.loc[0, 1]
# A 314
# B 314
# C 314
# Name: (0, 1), dtype: int64
df_new.loc[(0, 2), 'B']
# 42
df_new.loc[(0, slice(None)), 'B']
# 0 0 0
# 1 314
# 2 42
# Name: 1, dtype: int64