如何将多列重新排列为具有相同索引的一列
how to re-arrange multiple columns into one column with same index
我正在使用python pandas,我想将一个相同的索引调整为多个列,并使其成为一列。并且如果可以的话,我也想删除零值。
我有这个数据框
index A B C
a 8 0 1
b 2 3 0
c 0 4 0
d 3 2 7
我希望我的输出看起来像这样
index data value
a A 8
b A 2
d A 3
b B 3
c B 4
d B 2
a C 1
d C 7
===
我如下解决了这个任务。我的原始数据有 2 个索引和数据框中的 0 个是 NaN
个值。
起初,我尝试应用 melt
函数,同时删除此 () 之后的 NaN
值,但我做不到。
因为我的原始数据有几列('value_vars')。所以我分两步重新组织了数据框:
- 首先,我通过
melt
函数将多列变成了单列,
- 然后通过
dropna
函数删除每行中的 NaN
个值。
试试这个:
array = [['a', 8, 0, 1], ['b', 2, 3, 0] ... ]
cols = ['A', 'B', 'C']
result = [[[a[i][0], cols[j], a[i][j + 1]] for i in range(len(a))] for j in range(2)]
输出:
[[['a', 'A', 8], ['b', 'A', 2]], [['a', 'B', 0], ['b', 'B', 3]] ... ]
这看起来有点像 pandas
中的 melt
函数,唯一的区别是索引。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html
这是一些您可以 运行 测试的代码:
import pandas as pd
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},'B': {0: 1, 1: 3, 2: 5},'C': {0: 2, 1: 4, 2: 6}})
pd.melt(df)
稍加操作,您就可以解决索引问题。
这不是特别 pythonic,但如果您的列数有限,您可以使用:
molten = pd.melt(df)
a = molten.merge(df, left_on='value', right_on = 'A')
b = molten.merge(df, left_on='value', right_on = 'B')
c = molten.merge(df, left_on='value', right_on = 'C')
merge = pd.concat([a,b,c])
我正在使用python pandas,我想将一个相同的索引调整为多个列,并使其成为一列。并且如果可以的话,我也想删除零值。
我有这个数据框
index A B C
a 8 0 1
b 2 3 0
c 0 4 0
d 3 2 7
我希望我的输出看起来像这样
index data value
a A 8
b A 2
d A 3
b B 3
c B 4
d B 2
a C 1
d C 7
===
我如下解决了这个任务。我的原始数据有 2 个索引和数据框中的 0 个是 NaN
个值。
起初,我尝试应用 melt
函数,同时删除此 (NaN
值,但我做不到。
因为我的原始数据有几列('value_vars')。所以我分两步重新组织了数据框:
- 首先,我通过
melt
函数将多列变成了单列, - 然后通过
dropna
函数删除每行中的NaN
个值。
试试这个:
array = [['a', 8, 0, 1], ['b', 2, 3, 0] ... ]
cols = ['A', 'B', 'C']
result = [[[a[i][0], cols[j], a[i][j + 1]] for i in range(len(a))] for j in range(2)]
输出:
[[['a', 'A', 8], ['b', 'A', 2]], [['a', 'B', 0], ['b', 'B', 3]] ... ]
这看起来有点像 pandas
中的 melt
函数,唯一的区别是索引。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html
这是一些您可以 运行 测试的代码:
import pandas as pd
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},'B': {0: 1, 1: 3, 2: 5},'C': {0: 2, 1: 4, 2: 6}})
pd.melt(df)
稍加操作,您就可以解决索引问题。
这不是特别 pythonic,但如果您的列数有限,您可以使用:
molten = pd.melt(df)
a = molten.merge(df, left_on='value', right_on = 'A')
b = molten.merge(df, left_on='value', right_on = 'B')
c = molten.merge(df, left_on='value', right_on = 'C')
merge = pd.concat([a,b,c])