Python使dataframe的列与list元素一致

2024-10-01 17:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

根据我所读到的,在DataFrame中添加和删除列是很容易的,但是我想知道是否已经有一种方法可以实现我正在尝试实现的目标,以避免重新发明轮子。在

假设我有DataFramex

   a  b   c
0  1  5   8
1  2  6   9
2  3  7  10

我想验证列名是否只对应于列表l中包含的元素。如果l中的元素少于x中的列,我希望删除丢失的列。在

例如,如果l = ["a", "b"]x将变成:

^{pr2}$

另一方面,如果l中的元素多于x中的列,我想创建新的、相应命名的列,该列上的所有值都设置为0。在

例如,如果l = ["a", "b", "c", "d"]x将变成:

   a  b   c  d
0  1  5   8  0
1  2  6   9  0
2  3  7  10  0

我可以做一个循环来检查x中的列名和{}中的元素之间的一致性,但是有没有比这更有效的方法呢?在


Tags: 方法元素目标dataframe列表命名轮子一致性
3条回答

我想帕金森病可能是一种实现目标的方法。在

In [47]: import pandas as pd

In [48]: data = {
    ...: 'a': [1, 2, 3],
    ...: 'b': [5, 6, 7],
    ...: 'c': [8, 9, 10]
    ...: }

In [49]: x = pd.DataFrame(data)

In [50]: x
Out[50]: 
   a  b   c
0  1  5   8
1  2  6   9
2  3  7  10

In [51]: l = ["a", "b"]

In [52]: x[l]
Out[52]: 
   a  b
0  1  5
1  2  6
2  3  7

In [53]: l = ["a", "b", "c", "d"]

In [55]: y = pd.DataFrame(columns=l)

In [56]: y
Out[56]: 
Empty DataFrame
Columns: [a, b, c, d]
Index: []

In [57]: pd.concat((x, y))
Out[57]: 
     a    b     c    d
0  1.0  5.0   8.0  NaN
1  2.0  6.0   9.0  NaN
2  3.0  7.0  10.0  NaN

In [58]: pd.concat((x, y)).fillna(0)
Out[58]: 
     a    b     c  d
0  1.0  5.0   8.0  0
1  2.0  6.0   9.0  0
2  3.0  7.0  10.0  0

我写了一个简单的函数来获得你想要的。标识是使用set操作完成的,但是它使用insert循环创建新列。也许有更好的方法来完成这个循环?在

def func_df(df, l):

    # First find intersection
    intersect = set(df.columns).intersection(set(l))
    df = df.loc[:, intersect]

    # Now find list elements not here.
    additions = set(l).difference(overlap)
    for i in additions:
        df.insert(0, i, 0)

    return df


df = pd.DataFrame(
        [[1, 5, 8],
         [2, 6, 9],
         [3, 7, 10]], columns=['a', 'b', 'c'])


out = func_df(df, ['a', 'b', 'd', 'k'])

print(out)
   k  d  a  b
0  0  0  1  5
1  0  0  2  6
2  0  0  3  7

只需使用(添加.astype(np.int公司)如果需要,感谢@Bill。请注意,这会将整个数据帧转换为整数):

df.loc[:, l].fillna(0).astype(np.int)

案例1:

^{pr2}$

案例2:

l = ["a", "b", "c", "d"]
df.loc[:, l].fillna(0).astype(np.int)

    a   b   c   d
0   1   5   8   0
1   2   6   9   0
2   3   7   10  0

相关问题 更多 >

    热门问题